标准库sorting和用户定义的types

如果我想通过它所持有的两种types的variables之一对UDT的向量进行sorting,标准库sorting可以执行此操作,还是需要编写自己的sorting函数。

例如,如果你有

struct MyType{ int a; int b; }; vector<MyType> moo; // do stuff that pushes data back into moo sort(moo.begin(), moo.end()) // but sort it by lowest to highest for a, not b 

那么这是可能的使用stdlibsorting? 谢谢。

如果你的types实现了"bool operator < (...) const"和一个拷贝构造函数(编译器生成或定制的),那么可以使用标准函数。

 struct MyType { int a; int b; bool operator < (const MyType& other) const { ... // a meaningful implementation for your type } // Copy constructor (unless it's a POD type). MyType(const MyType &other) : a(other.a), b(other.b) { } // Some other form of construction apart from copy constructor. MyType() : a(0), b(0) { } }; 

或者,您可以传递一个sorting函数(或函数)作为sort()的第三个参数,而不是实现运算符"<"

 bool type_is_less(const MyType& t1, const MyType& t2) { ... } ... std::sort(c.begin(), c.end(), type_is_less); 

这在以下情况下非常有用:

  1. 不pipe出于什么原因你都不想实现运算符"<"
  2. 您需要对不能重载操作符的内置或指针types的容器进行sorting。
  3. 您希望使用不同的顺序对序列进行sorting。 例如:有时候你需要一个结构,名字是姓氏,其他时候是姓氏。 两个不同的函数(或函子)使这样的选项变得微不足道。

有三种方法可以做到这一点:

你可以为你的类重载operator<

 bool operator<(const MyType& lhs, const MyType& rhs) {return lhs.a<rhs.a;} 

这有一个缺点,如果你想要按照b来sorting,那你就不好运气了。

你也可以为你的types专门化std::less 。 这使得std::sort工作(和其他的东西,比如使用types作为map中的一个键)而不劫持operator<来表示这个意思。 但是,它仍然会劫持一个通用的比较语法,而您可能会在代码的其他地方按照b来比较您的types。

或者你可以这样写自己的比较器:

 struct compare_by_a { bool operator()(const MyType& lhs, const MyType& rhs) const {return lhs.a<rhs.a;} }; 

(注意:运算符之后的const不是严格必要的,但我仍然认为它是很好的风格。)这就使得通用的比较方法没有定义; 所以如果一些代码想要使用它们而不知道,编译会发出一个错误,让你意识到这一点。 您可以select性地使用这个或其他比较器,并且在需要比较的地方进行显式指定