std::vector move 而不是交换到空 vector 并释放存储
std::vector move instead of swap to empty vector and deallocate storage
我是否正确理解,通过在 C++11 中引入移动语义,可以使用 move 代替交换到清除习语来清空包括存储释放在内的向量?
std::vector<T>().swap( v );
// VS
v = std::move( std::vector<T>() );
第二种方法是否保证与第一种方法有效?
附言。正如@MaximEgorushkin所指出的,由于分配了 r 值,因此不需要上面的std::move
。
您可能将其与std::vector<T>(v).swap(v);
混淆 - 修剪矢量存储。
不过,在分配 r 值时不需要调用std::move
,只需
v = std::vector<T>(v);
就够了。
为了完全清楚起见,如果你想要的只是你的向量是空的,你可以使用
v.clear();
假设您希望它释放分配的存储,那么移动分配通常将起作用:
v = std::vector<T>();
(请参阅文档保证移动窃取右侧的分配,这将具有预期的效果(。
请注意同一文档中提到的异常:如果您有一个非传播有状态分配器,您将获得逐个元素的移动,并且无法保证分配的存储会发生什么。
在这种情况下,v.shrink_to_fit()
可能会起作用,尽管这是一个实施质量问题而不是承诺。请注意,在这种情况下,旧的swap
技术也不起作用,因此这可能是避免这种分配器的一个很好的理由。
是的,你理解正确。
请注意,您的实现实际上可能通过交换语义实现了向量移动语义,这意味着您的
v = std::vector<T>();
可能最终与原始交换完全等效。
相关文章:
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- std::vector move 而不是交换到空 vector 并释放存储
- 将可变参数模板类存储到 std::vector 中
- 在 std::vector<无符号字符中存储任意数据的方法>
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- 将数据从 std::Vector 存储到 Eigen::Vector 时出错
- 如何将自定义特征张量类存储到 std::vector 中?
- 如何在 std::vector 中存储来自 std:<short>:vector <uint8_t>的数据
- 如何在OpenCV中存储部分轮廓点喜欢新矢量中的左侧,该类型为<vector<vector<Point>>
- 如何从 Pyhon 端对存储在 std::vector 中的对象进行持久更改,作为 std::shared_ptr
- 使用 std::vector<char> 作为异构记录的存储是否安全?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 从 CSV 读取并存储在 Vector 中
- 代码将向量存储为向量<vector>,为什么没有错误消息?
- 使用运算符重载添加存储在 vector 中的类对象
- 如何在文件中节省空间地存储和检索 std::vector<int> 值
- 从std::vector存储到std::set,其中vector包含一个结构体,而std::set只包含该结构体中的一个
- 使用vector存储实体
- c++在循环期间将vector存储在数组中