标准库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);
这在以下情况下非常有用:
- 不pipe出于什么原因你都不想实现运算符
"<"
- 您需要对不能重载操作符的内置或指针types的容器进行sorting。
- 您希望使用不同的顺序对序列进行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性地使用这个或其他比较器,并且在需要比较的地方进行显式指定