如果类使操作员超载以促进通过特定属性对其对象进行排序,是否有办法再次超载操作员以通过另一个属性进行排序?
例如,下面的类已超载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;
}
您还可以提出提供替代分类方法的额外朋友功能,在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);
另外,您可以在诸如集合之类的有序容器上超载比较器:
std::multiset<PhoneCall, LessTime> timeSet;
与公共静态方法相比,在这里使用内联朋友的好处很小。内联朋友的真正好处是在执行操作员超载时,例如operator <<
不,您不可能。相反,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函数作为第三个参数确实按小时进行比较。