首页 > 解决方案 > 标准::向量::insert 和 std::move_iterator他们如何一起工作?

问题描述

我不太确定这一点,所以请解释一下它是如何工作的。

让我们考虑以下代码。

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 ()));
}

所有的元素v都会被移动吗?std::vector<T>::insert()因为范围版本需要第一个最后一个迭代器,所以有这样的代码怎么知道它v.begin()+1 也必须被移动?是否std::vector<T>::insert()区分“正常”和“移动”迭代器的实现?

标签: c++c++11

解决方案


[是否]std::vector<T>::insert()区分“正常”和“移动”迭代器的实现?

不,“魔术”发生在move_iterator::operator*():它返回一个右值引用。因此,当insert()填充新分配的元素时,它更喜欢移动构造函数,因此移动值。

所以,是的,你可以确定*(v.begin()+1)在手术后已经被移动了。


推荐阅读