如果我在 C++ 类中实现
operator <
,我还应该实现其他比较运算符吗? (operator >
和operator ==
等)
或者班级是否以某种方式自动从其他班级获得一个?
我想使用 STL
std::sort
和 std::priority_queue
使我的课程具有可比性。
(注意:我的班级有一个
double
成员,我将其用作排序键,因此它具有实数的排序特征,如果我理解正确,这将使其成为严格的总排序。)
如果你只是想让你的类与使用
std::sort
和 std::priority_queue
具有可比性,那么重载 operator<
就可以了。如here所述
比较函数对象(即满足比较要求的对象),如果第一个参数小于(即先于)第二个参数,则返回真。
operator<
功能确实满足要求。如果未指定自定义比较器,则元素也会通过 operator<
进行比较。
(1)template< class RandomIt > void sort( RandomIt first, RandomIt last );
- 使用
比较元素。operator<
同样适用于
std::priority_queue
.
所以在你的情况下,如果你唯一的要求是使用
operator<
和std::sort
,你可以只使用std::priority_queue
。
但是,如果您要使用
std::greater
颠倒顺序,则需要实施 operator>
。如here所述
用于执行比较的函数对象。除非专门化,否则在类型 T.
上调用operator>
但是,如果您只打算使用
std::greater
对班级进行排序。你可以通过一个小技巧来做到这一点。如果您按原样实施operator<
operator>
,它将按预期进行。
operator<=>
可用于替换全套比较运算符。
但是,特别是为了使实例可用于标准库容器,只需要
operator<
。甚至 std::set
不需要或使用运算符==.
如果明确指定比较谓词,即使没有实现
operator<
的类型也可以排序。但是这里没有要实现的正式接口。标准库模板类和算法简单地使用临时多态性:如果提供了库代码实际使用的运算符,则该类型是可以接受的。
对于 C++20 之前的 C++ 版本,实现其他比较(至少
==
)可能仍然是一个好主意 - 因为 other 代码(可能是您自己的)可能想要使用它们。
这里之所以如此混乱(乐观地说:如此灵活)是因为这些运算符在概念上有许多不同的有意义的语义。对实数(以及整数等子集;因此,C++ 类型
double
、float
、int
等)进行比较的方式称为 全序 并且是最严格的解释。另一方面:
复数可以有意义地比较是否相等,但是当它们不相等时说一个“小于”另一个是无意义的(尽管它们的 magnitudes 是实数值并且可以这样比较,例如) .
集合可以有意义地彼此“小于”(通常这被解释为子集关系),“小于或等于”等 - 但给定两个不相等的集合,它可以(常见情况!)两者都不是“小于”另一个。这是部分订单.