C++ 标准::向量<;T>;::插入和标准::移动迭代器<;T>;他们是如何合作的?
我对此不太确定,所以请解释一下它是如何工作的C++ 标准::向量<;T>;::插入和标准::移动迭代器<;T>;他们是如何合作的?,c++,c++11,C++,C++11,我对此不太确定,所以请解释一下它是如何工作的 让我们考虑下面的代码。 std::vector<std::string> vec {}; void add (std::vector<std::string>&& v) { using iter = std::vector<std::string>::iterator; vec.insert (vec.end (), std::move_iter
让我们考虑下面的代码。
std::vector<std::string> vec {};
void add (std::vector<std::string>&& v) {
using iter = std::vector<std::string>::iterator;
vec.insert (vec.end (),
std::move_iterator<iter> (v.begin ()),
std::move_iterator<iter> (v.end ()));
}
std::vector向量{};
无效添加(标准::向量和(&v){
使用iter=std::vector::迭代器;
vec.insert(vec.end(),
std::move_迭代器(v.begin()),
std::move_迭代器(v.end());
}
v
的所有元素都将被移动吗<对于范围版本,code>std::vector::insert()需要first和last迭代器,所以有这样的代码,它怎么知道v.begin()+1
也必须移动?std::vector::insert()的实现是否区分了“普通”和“移动”迭代器
std::vector::insert()
的实现是否区分了“普通”和“移动”迭代器
不。神奇的是:它返回一个右值引用。因此,当insert()
填充新分配的元素时,它更喜欢移动构造函数,因此会移动值
因此,是的,您可以确定*(v.begin()+1)
在操作后已被移动。当然,这是我在move_iterator文档中读到的,我的疑问是insert如何知道v.begin()+1以及v.begin()和v.end()应该被移动?@Artur:insert
以传入的迭代器类型为模板。当insert
从begin
循环到end
迭代器时,迭代器变量永远不会改变其类型。特别是,您认为它必须计算std::move_迭代器(v.begin()+1)
,但这是错误的。它计算一个预增量autoit=std::move_迭代器(v.begin())++它代码>。。。它指向与v.begin()+1
相同的元素,但迭代器是move\u迭代器
,并且始终是move\u迭代器
。增量无法更改对象的类型。@Ben,现在我觉得自己很傻。很明显,谢谢;)