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

时间:2016-01-10 00:01:38

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

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

2 个答案:

答案 0 :(得分:2)

  

如何确保在对数据向量进行排序时,std :: sort将会   仍然使用move-constructor和move-assignment?

实际上,你不需要。您必须确保使用的swap函数直接或间接利用移动构造函数中已使用的任何技巧。那就是我认为它是如何运作的。换句话说,sort需要良好的交换,而不一定是副本。

“直接”可能意味着只使用使用移动构造函数的默认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注意到,直接排序算法)将使用移动构造函数。

答案 1 :(得分:2)

swap类提供move-constructor,move-assignment和free Data - function(在同一名称空间中)