Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标准::向量<;T>;::插入和标准::移动迭代器<;T>;他们是如何合作的?_C++_C++11 - Fatal编程技术网

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()需要firstlast迭代器,所以有这样的代码,它怎么知道
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,现在我觉得自己很傻。很明显,谢谢;)