如何解决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 举报,一经查实,本站将立刻删除。