如果我正在实施运算符< in C++, should I also implement operator>和运算符==?

问题描述 投票:0回答:2

如果我在 C++ 类中实现

operator <
,我还应该实现其他比较运算符吗? (
operator >
operator ==
等)

或者班级是否以某种方式自动从其他班级获得一个?

我想使用 STL

std::sort
std::priority_queue
使我的课程具有可比性。

(注意:我的班级有一个

double
成员,我将其用作排序键,因此它具有实数的排序特征,如果我理解正确,这将使其成为严格的总排序。)

c++ operator-overloading
2个回答
2
投票

如果你只是想让你的类与使用

std::sort
std::priority_queue
具有可比性,那么重载
operator<
就可以了。如here

所述

比较函数对象(即满足比较要求的对象),如果第一个参数小于(即先于)第二个参数,则返回真。

operator<
功能确实满足要求。如果未指定自定义比较器,则元素也会通过
operator<
进行比较。

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

  1. 使用
    operator<
    比较元素。

同样适用于

std::priority_queue
.

所以在你的情况下,如果你唯一的要求是使用

operator<
std::sort
,你可以只使用
std::priority_queue

但是,如果您要使用

std::greater
颠倒顺序,则需要实施
operator>
。如here

所述

用于执行比较的函数对象。除非专门化,否则在类型 T.

 上调用 
operator>

但是,如果您只打算使用

std::greater
对班级进行排序。你可以通过一个小技巧来做到这一点。如果您按原样实施
operator<
operator>
,它将按预期进行。


1
投票

其他运算符不会自动生成,尽管 C++20 提供了

operator<=>
可用于替换全套比较运算符。

但是,特别是为了使实例可用于标准库容器,只需要

operator<
。甚至
std::set
不需要或使用运算符==
.

如果明确指定比较谓词,即使没有实现

operator<
的类型也可以排序。但是这里没有要实现的正式接口。标准库模板类和算法简单地使用临时多态性:如果提供了库代码实际使用的运算符,则该类型是可以接受的。

对于 C++20 之前的 C++ 版本,实现其他比较(至少

==
)可能仍然是一个好主意 - 因为 other 代码(可能是您自己的)可能想要使用它们。

这里之所以如此混乱(乐观地说:如此灵活)是因为这些运算符在概念上有许多不同的有意义的语义。对实数(以及整数等子集;因此,C++ 类型

double
float
int
等)进行比较的方式称为 全序 并且是最严格的解释。另一方面:

  • 复数可以有意义地比较是否相等,但是当它们不相等时说一个“小于”另一个是无意义的(尽管它们的 magnitudes 是实数值并且可以这样比较,例如) .

  • 集合可以有意义地彼此“小于”(通常这被解释为子集关系),“小于或等于”等 - 但给定两个不相等的集合,它可以(常见情况!)两者都不是“小于”另一个。这是部分订单.

© www.soinside.com 2019 - 2024. All rights reserved.