2 回答
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);
在以下情况下这很有用:
您不想"<"出于任何原因实施运算符,
您需要对不能重载运算符的内置或指针类型的容器进行排序。
您希望使用不同的顺序对序列进行排序。例如:有时候您想要一个结构,其名字/姓氏成员按名字排序,有时则按姓氏排序。两种不同的功能(或函子)使此类选项变得微不足道。
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操作符不是严格必需的。不过,我仍然认为它是好的样式。)这使通用比较方法不确定。因此,如果某些代码想要在您不知情的情况下使用它们,则编译会发出错误并使您知道。您可以在需要比较的地方有选择地显式使用此比较器或其他比较器。
- 2 回答
- 0 关注
- 324 浏览
添加回答
举报