如果我在C++中实现了operator〈,我应该同时实现operator>和operator==吗?

ljo96ir5  于 2023-04-01  发布在  其他
关注(0)|答案(2)|浏览(113)

如果我在C++类中实现operator <,我是否还应该实现其他比较运算符?(operator >operator ==等)
还是类以某种方式自动地从其他类中获取一个?
我想使用STL std::sortstd::priority_queue使我的类具有可比性。
(note:我的类有一个double成员,我将其用作排序键,因此它共享真实的的排序特征,如果我理解正确,它是一个严格的全序。)

v7pvogib

v7pvogib1#

如果你只是想让你的类在使用std::sortstd::priority_queue时具有可比性,那么重载operator<就可以了。
比较函数对象(即满足比较要求的对象),如果第一个参数小于第二个参数(即排序在第二个参数之前),则返回true。
operator<函数确实满足要求。如果没有指定自定义比较器,operator<也会比较元素。
template< class RandomIt > void sort( RandomIt first, RandomIt last );(1)
1.使用operator<比较元素。
这也适用于std::priority_queue
因此,在您的情况下,如果您的唯一要求是使用std::sortstd::priority_queue,则可以只使用operator<
但是,如果您要用std::greater颠倒顺序,则需要实现operator>
用于执行比较的函数对象。除非特殊化,否则调用类型T上的operator>
但是,如果你只打算使用std::greater来对类进行排序,你可以通过一个小技巧来做到这一点。如果你像operator>那样实现operator<,它会做预期的事情。

fjnneemd

fjnneemd2#

其他运算符不是自动生成的,尽管C20提供了operator<=>,它可以用来替换一整套比较运算符。
然而,特别是为了使示例可订购标准库容器,* 只需要operator< *。甚至std::set does not require or use operator==
如果显式指定比较 predicate ,即使没有实现operator<的类型也可以排序。但是这里没有正式的接口可以实现。标准库模板类和算法只是使用ad-hoc多态性:如果提供了库代码实际使用的操作符 *,则该类型是可接受的。
对于C
20之前的C版本,实现其他比较(至少==)可能仍然是一个好主意-因为 * 其他 * 代码(可能是您自己的)可能想要使用它们。
之所以会出现这样的乱象(乐观地说:如此多的灵活性)是因为这些运算符在概念上有许多不同的有意义的语义。因此,C
类型doublefloatint等)被称为total ordering,是最严格的解释。另一方面:

  • 复数可以有意义地进行相等性比较,但是当它们不相等时,说一个“小于”另一个是毫无意义的(尽管它们的 * 幅度 * 是实值的,可以这样比较,例如)。
  • 集合可以有意义地彼此“小于”(通常这被解释为子集关系),“小于或等于”等-但给定两个不相等的集合,它可以是(常见的情况!)没有一个“小于”另一个。这是一个partial order

相关问题