是否有利用移动的 back_inserter 变体?

alf*_*lfC 5 c++ copy move push-back c++11

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

#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?
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为 的元素不可能v真正移动到w,因为毕竟back_inserter会执行 apush_back这意味着复制到w

在这种std::move情况下,v元素似乎更有可能被移动到临时文件中,然后才复制到w.

那是对的吗?真的有std::back_inserter什么动静吗?

是否已经有一种std::back_inserter利用移动/安置的变体?std::back_emplacer?

眠りネ*_*ネロク 3

std::back_inserter()是用于创建对象的便捷函数模板std::back_insert_iterator

该类std::back_insert_iterator已经operator=重载以获取右值引用类型,即:

back_insert_iterator<Container>& operator=(typename Container::value_type&& value);
Run Code Online (Sandbox Code Playgroud)

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