C++重载==和<之间的运算符差异;

C++ overloading operators difference between == and <

本文关键字:运算符 之间 lt 重载 C++      更新时间:2023-10-16

有人能解释一下过载==<之间的区别吗?

例如,如果我使用地图:

map<Type, int> a();
friend bool operator<(const Type& lhs, const Type& rhs);
friend bool operator==(const Type& lhs, const Type& rhs);

当我调用时,我实现了这两个运算符

a.find(value);

是否正在调用==的运算符函数?我想不是。我调试并看到调用了<,但为什么?<的运算符函数的行为应该是什么?

我来自调用方法equals的Java,理解行为非常简单。

谢谢。

operator==重载==运算符(没有其他运算符);operator<重载CCD_ 10运算符(而不是其他运算符)。

std::map被定义为使用std::less(并且仅使用std::less)并且std::less被定义为默认使用<。一般来说但是,我建议不要重载operator<,除非有序比较对您的类是有意义的,在这种情况下,您应该以连贯的方式重载所有六个比较运算符。否则,您可以将比较函数类型指定为附加std::map的模板参数;比较函数对象应该定义一个严格的弱序关系。如果该类型设计为用作密钥,但排序仍然完全是任意的,您可以专用CCD_ 18。

至于Java,如果没有运算符重载,它显然无法使用<;默认情况下,SortedMap(相当于std::map的Java)需要然而,密钥是可比较的,这反过来又需要compare函数,返回值<==> 0,具体取决于this<==>。我承认我觉得这是稍微合乎逻辑一点,但差别非常非常小。(C++决策背后的基本原理是像int或CCD_ 31可以用作密钥。在Java中,你必须把它们装箱。)

C++标准对std::map的要求意味着它被实现为一个自平衡的二进制搜索树。这意味着元素之间必须有某种排序比较。在std::map的情况下,要求是严格的弱排序,默认情况下是小于比较。这就是在二叉树中排列元素所需的全部条件,当一个元素(称为a)不小于另一个元素时(称为B),满足相等条件,反之亦然,即B不小于a。可以使用相等比较,但这会为不一致性打开一些范围。如果您查看散列表,如std::unordered_map,您会发现确实需要进行相等比较,尽管这只是为了解决冲突。

需要运算符<,因为find操作基于map(在树上)的内部实现。为了能够在复杂性上比线性更好地找到,它不必与每个元素进行比较。

类似算法的一个很好的例子是二进制搜索。正如您在示例伪代码中看到的,它根本不使用标识运算符。

因为std::map<T, U>有这样的行为,所以它使用std::less<T>函子或您的函子进行许多操作。

行为可能不同,但通常检查lhs是否小于rhs。

可能是因为map是作为一个平衡树实现的。如果需要哈希表,请使用unordered_map。

std::map是一个有序容器,因此它需要一个operator <来定义元素的顺序。

不需要单独的operator ==,因为它是根据operator <实现的,a==b等效于!a<b && !b<a