如何强制 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
函数(在同一命名空间中)
我有一个 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
swap
函数(在同一命名空间中)