微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std :: vector <T> :: insert和std :: move_iterator <T>它们如何协同工作?

如何解决std :: vector <T> :: insert和std :: move_iterator <T>它们如何协同工作?

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

让我们考虑以下代码

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()需要 first last 迭代器,因此拥有这样的代码如何知道v.begin()+1也必须被移动? std::vector<T>::insert()的实现是否区分“普通”迭代器和“移动”迭代器?

解决方法

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

不。 {魔术}发生在move_iterator::operator*()中:它返回右值引用。因此,当insert()填充新分配的元素时,它更喜欢move-constructor,因此移动了值。

因此,是的,您可以确定操作后*(v.begin()+1)已移动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。