标准库排序和用户定义的类型

如果我想通过它所持有的两种类型的变量之一对UDT的向量进行排序,则标准库排序是否可以执行此操作,还是我需要编写自己的排序函数?


例如,如果您有


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

那么可以使用stdlib排序吗?谢谢。


喵喵时光机
浏览 325回答 2
2回答

慕盖茨4494581

如果您的类型实现"bool operator < (...) const"和复制构造函数(由编译器生成或自定义),则可以使用标准函数。struct MyType {&nbsp; &nbsp; int a;&nbsp; &nbsp; int b;&nbsp; &nbsp; bool operator < (const MyType& other) const {&nbsp; &nbsp; &nbsp; &nbsp; ... // a meaningful implementation for your type&nbsp; &nbsp; }&nbsp; &nbsp; // Copy constructor (unless it's a POD type).&nbsp; &nbsp; MyType(const MyType &other)&nbsp; &nbsp; &nbsp; &nbsp; : a(other.a), b(other.b) { }&nbsp; &nbsp; // Some other form of construction apart from copy constructor.&nbsp; &nbsp; MyType()&nbsp; &nbsp; &nbsp; &nbsp; : a(0), b(0) { }};另外,您可以将排序函数(或函子)作为第三个参数传递给,sort()而不是实现operator "<"。bool type_is_less(const MyType& t1, const MyType& t2) { ... }...std::sort(c.begin(), c.end(), type_is_less);在以下情况下这很有用:您不想"<"出于任何原因实施运算符,您需要对不能重载运算符的内置或指针类型的容器进行排序。您希望使用不同的顺序对序列进行排序。例如:有时候您想要一个结构,其名字/姓氏成员按名字排序,有时则按姓氏排序。两种不同的功能(或函子)使此类选项变得微不足道。

慕妹3146593

有三种方法可以做到这一点:您可以operator<为您的课程重载:bool operator<(const MyType& lhs, const MyType& rhs) {return lhs.a<rhs.a;}这样做的缺点是,如果您想根据进行排序b,那么您很不走运。您也可以专门std::less针对您的类型。这样就可以进行std::sort工作(以及其他一些事情,例如在地图中使用类型作为键),而不必operator<为此劫持。但是,它确实仍然劫持了的通用比较语法a,而您可能会在代码的其他位置根据来比较类型b。或者您可以这样编写自己的比较器:struct compare_by_a {&nbsp; bool operator()(const MyType& lhs, const MyType& rhs) const&nbsp; {return lhs.a<rhs.a;}};(注意:const操作符不是严格必需的。不过,我仍然认为它是好的样式。)这使通用比较方法不确定。因此,如果某些代码想要在您不知情的情况下使用它们,则编译会发出错误并使您知道。您可以在需要比较的地方有选择地显式使用此比较器或其他比较器。
打开App,查看更多内容
随时随地看视频慕课网APP