为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
喵喵时光机 2019-11-03 04:04:02
如果我想通过它所持有的两种类型的变量之一对UDT的向量进行排序,则标准库排序是否可以执行此操作,还是我需要编写自己的排序函数?例如,如果您有struct MyType{ int a; int b;};vector<MyType> moo;// do stuff that pushes data back into moosort(moo.begin(), moo.end()) // but sort it by lowest to highest for a, not b那么可以使用stdlib排序吗?谢谢。
查看完整描述

2 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

如果您的类型实现"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) { }

};

另外,您可以将排序函数(或函子)作为第三个参数传递给,sort()而不是实现operator "<"。


bool type_is_less(const MyType& t1, const MyType& t2) { ... }

...

std::sort(c.begin(), c.end(), type_is_less);

在以下情况下这很有用:


您不想"<"出于任何原因实施运算符,

您需要对不能重载运算符的内置或指针类型的容器进行排序。

您希望使用不同的顺序对序列进行排序。例如:有时候您想要一个结构,其名字/姓氏成员按名字排序,有时则按姓氏排序。两种不同的功能(或函子)使此类选项变得微不足道。



查看完整回答
反对 回复 2019-11-04
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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


您可以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 {

  bool operator()(const MyType& lhs, const MyType& rhs) const

  {return lhs.a<rhs.a;}

};

(注意:const操作符不是严格必需的。不过,我仍然认为它是好的样式。)这使通用比较方法不确定。因此,如果某些代码想要在您不知情的情况下使用它们,则编译会发出错误并使您知道。您可以在需要比较的地方有选择地显式使用此比较器或其他比较器。



查看完整回答
反对 回复 2019-11-04
  • 2 回答
  • 0 关注
  • 324 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信