如何强制 std::sort 使用移动构造函数和移动赋值?

How to force std::sort to use move constructor and move-assignment?

我有一个 class Data 是(目前)不可复制的。 std::sort on std::vector<Data> 有效,因为我已经为 Data 定义了移动构造函数和移动赋值。我这样做是因为 class 里面有很多数据,复制内容太慢了。但是,出于不相关的原因,我现在正在考虑向 class 添加复制构造函数 Data(const Data& other) 和标准赋值运算符(从 const Data&)。如何确保当我对 Data 的向量进行排序时,std::sort 仍将使用移动构造函数和移动赋值?

How can I make sure that when I sort a vector of Data, std::sort will still use the move-constructor and move-assignment?

其实,你不需要。您必须确保使用的 swap 函数直接或间接地利用了移动构造函数中已经使用的任何技巧。这就是我认为它是如何工作的。换句话说,sort需要一个很好的交换,不一定是一个副本。

其中 "directly" 可能意味着简单地使用默认值 std::swap,尽可能使用移动构造函数。

template <class T> void swap (T& a, T& b)
{
  T c(std::move(a)); a=std::move(b); b=std::move(c);
}

所以,很有可能,您不需要做任何特别的事情,因为 swap(或者正如@MarcGlisse 指出的那样,直接排序算法)将使用移动构造函数。

只需为您的 Data class

提供 move-constructor、move-assignment 和免费的 swap 函数(在同一命名空间中)