std::vector move 而不是交换到空 vector 并释放存储

std::vector move instead of swap to empty vector and deallocate storage

本文关键字:vector 存储 释放 move std 交换      更新时间:2023-10-16

我是否正确理解,通过在 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>();

可能最终与原始交换完全等效。