std :: vector移动而不是交换为空向量并取消分配存储空间

时间:2018-09-28 16:10:00

标签: c++ c++11 move-semantics

我是否正确理解,随着C ++ 11中的move语义的引入,可以使用move而不是swap-to-clear惯用语来清空包含存储释放的向量?

std::vector<T>().swap( v );
// VS
v = std::move( std::vector<T>() );

第二种方法是否一定能像第一种一样工作?

PS。正如@MaximEgorushkin指出的那样,由于分配了r值,因此在以上std::move中没有必要。

3 个答案:

答案 0 :(得分:3)

您可能将其与std::vector<T>(v).swap(v);混淆-修剪矢量存储。

不过,分配r值时无需调用std::move,只需

v = std::vector<T>(v);

就足够了。

答案 1 :(得分:3)

为清晰起见,如果您只想让向量<空>为空,则可以使用

v.clear();

假设您希望它释放已分配的存储,那么一般来说,移动分配将起作用:

v = std::vector<T>();

(请注意,documentation确保此举会窃取右侧的分配,这将产生预期的效果)。

请注意同一文档中提到的例外:如果您使用的是非传播状态存储分配器,则将逐个元素移动,并且不能保证所分配的存储发生什么情况。

在这种情况下,v.shrink_to_fit()可能会起作用,尽管这是实现质量问题,而不是承诺。请注意,在这种情况下,旧的swap技术也不会起作用,因此,这可能是避免使用这种分配器的一个很好的理由。

答案 2 :(得分:0)

是的,您理解正确。

请注意,您的实现可能实际上通过交换语义实现了矢量移动语义,这意味着您

v = std::vector<T>();

最终可能会完全等同于原始交换。