在通用代码中,我试图告诉输出迭代器(实际上是std::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?
}
但我认为以下元素不可能v
真的很感动w
,因为毕竟back_inserter
将做一个push_back
这意味着复制到w
.
似乎更有可能的是,在std::move
case, v
元素被移动到临时位置,然后才复制到w
.
那是对的吗?有没有std::back_inserter
真的在某种程度上移动吗?
是否已经有一个变体std::back_inserter
这利用了移动/安置的优势?像一个std::back_emplacer
?
std::back_inserter() https://en.cppreference.com/w/cpp/iterator/back_insert_iterator是一个方便的函数模板,用于创建std::back_insert_iterator https://en.cppreference.com/w/cpp/iterator/back_insert_iterator/operator%3D object.
班上std::back_insert_iterator
已经operator=
超载携带右值引用类型,即:
back_insert_iterator<Container>& operator=(typename Container::value_type&& value);
所以,std::back_insert_iterator
已经准备好利用移动语义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)