重载小于(<)运算符以几种方式对对象进行排序

时间:2019-02-14 12:58:36

标签: c++ c++11

如果一个类重载了运算符以利于按特定属性对对象进行排序,是否有办法再次使运算符重载以按另一个属性进行排序?

例如,下面的类已重载operator<来比较其数据成员的分钟数,是否有办法对其数据成员的小时数做同样的事情,或者我会更好地为每次排序创建一个二进制谓词标准?提前致谢。

class PhoneCall {
  friend ostream& operator<<( ostream&,const PhoneCall& );
  private:
      int minutes;
      int hours;

  public:
      PhoneCall(int = 0);
      bool operator<(const PhoneCall&);
};

ostream& operator<<(ostream& out, const PhoneCall& p) {
   out << "Phone call lasted " << p.minutes << " minutes" << endl;
   return out;
}

PhoneCall::PhoneCall(int ct) {
    minutes = ct;
}

bool PhoneCall::operator<(const PhoneCall& p) {
    bool less = (minutes < p.minutes)? true: false;
    return less;
}

2 个答案:

答案 0 :(得分:2)

您还可以提供其他朋友功能,以提供其他排序方法,在c ++ 11中,您可以就地定义它们:

class PhoneCall {
 friend ostream& operator<<( ostream&,const PhoneCall& );
 private:
  int minutes;
  int hours;

 public:
  PhoneCall(int = 0);
  bool operator<(const PhoneCall&);
  friend bool LessTime(const PhoneCall& L, const PhoneCall& R)
  {  return L.minutes+L.hours*60 < R.minutes+R.hours*60; }

};

std::vector<PhoneCall> calls;
std::sort(calls.begin(), calls.end(), LessTime);

此外,您可以在有序容器(例如set)上重载比较器:

std::multiset<PhoneCall, LessTime> timeSet;

与公共静态方法相比,在此使用内联朋友的好处很小。内联好友的真正好处是可以进行操作符重载,例如operator <<

答案 1 :(得分:0)

不,您想要的是不可能的。相反,std::sort提供了两个重载。默认情况下使用operator<并使用重载符进行比较的重载:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

可以这样使用:

std::vector<PhoneCall> calls;
std::sort(calls.begin(), calls.end(), [](const PhoneCall& lhs, const PhoneCall& rhs) {
    return lhs.hours < rhs.hours;
});

请注意,lambda函数作为第三个参数的确按小时进行比较。