是否存在利用move优势的back_inserter变体? [英] Is there a back_inserter variant that takes advantage of move?

查看:103
本文介绍了是否存在利用move优势的back_inserter变体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在通用代码中,我试图告诉输出迭代器(实际上是std::back_inserter_iterator来移动一系列元素.令我惊讶的是,看起来好像是在move-to-back_inserter操作中移动了元素.

In generic code I was trying to tell an output iterator (in practice a std::back_inserter_iterator to move a range of elements. To my surprise it looked as if elements were moved in a move-to-back_inserter operation.

#include<algorithm> // move
#include<iterator> // back_inserter
#include<vector>
int main(){
    std::vector<std::vector<double> > v(10, std::vector<double>(100));
    std::vector<std::vector<double> > w;

    assert( not v[0].empty() and w.size() == 0 );
    std::copy(v.begin(), v.end(), std::back_inserter(w));
    assert( not v[0].empty() and w.size() == 10 );

    std::move(v.begin(), v.end(), std::back_inserter(w));
    assert( v[0].empty() and w.size() == 20 ); // were v elements moved to w?
}

但是,我认为v的元素实际上并没有移到w的可能性,因为毕竟back_inserter会执行push_back,这意味着要复制到w.

However I don't think it is possible that elements of v were really moved to w, because after all back_inserter will do a push_back which implies a copy to w.

std::move情况下,很可能将v元素移到了临时元素,然后才复制到w.

It seems more likely that in the std::move case, v elements were moved to a temporary and only then copied into w.

正确吗? std::back_inserter是否真的以某种方式移动?

Is that correct? Is there a std::back_inserter really moving somehow?

是否已经有std::back_inserter的变体利用了移动/进位?类似于std::back_emplacer的东西?

Is there already a variant of std::back_inserter that takes advantage of move/emplace? Something like an std::back_emplacer?

推荐答案

std::back_inserter() 是用于创建 std::back_insert_iterator 对象.

std::back_insert_iterator类已经operator=重载,可以使用 rvalue引用类型,即:

The class std::back_insert_iterator has already operator= overloaded for taking rvalue reference types, i.e.:

back_insert_iterator<Container>& operator=(typename Container::value_type&& value);

因此,std::back_insert_iterator已经准备好利用移动语义.

Therefore, std::back_insert_iterator is already prepared to take advantage of move semantics.

这篇关于是否存在利用move优势的back_inserter变体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆