我是否正确理解,随着C ++ 11中的move语义的引入,可以使用move而不是swap-to-clear惯用语来清空包含存储释放的向量?
std::vector<T>().swap( v );
// VS
v = std::move( std::vector<T>() );
第二种方法是否一定能像第一种一样工作?
PS。正如@MaximEgorushkin指出的那样,由于分配了r值,因此在以上std::move
中没有必要。
答案 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>();
最终可能会完全等同于原始交换。