c++ - 标准::向量::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()
区分“正常”和“移动”迭代器的实现?
解决方案
[是否]
std::vector<T>::insert()
区分“正常”和“移动”迭代器的实现?
不,“魔术”发生在move_iterator::operator*()
:它返回一个右值引用。因此,当insert()
填充新分配的元素时,它更喜欢移动构造函数,因此移动值。
所以,是的,你可以确定*(v.begin()+1)
在手术后已经被移动了。
推荐阅读
- python - 如何使用 django 数据库在 Openstreetmap folium 标记弹出窗口中添加图片?
- java - 如何在 Java 中获取泛型参数的类?
- amazon-web-services - 需要为账户 xxx 执行 AWS 调用,但尚未配置凭证
- python - Django DateTimeField 在 shell 和浏览器中显示不同的时间
- javascript - 为什么 react 中的状态钩子会改变对象的所有元素?
- python - 将多个国家/地区分配/映射到用户 Django
- angular - 使用 debounceTime 进行单元测试效果
- android - 如何将随机大小的图像完美地放入随机大小的图像视图中
- java - 如何 setRestartStrategy 使用 TableEnvironment?
- node.js - 其中包括 data.toString()