C ++重载运算符在==和<之间的区别

时间:2012-08-22 09:22:26

标签: c++ operator-overloading

有人可以解释一下,重载==<之间的区别是什么?

例如,如果我使用地图:

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);

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

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

感谢。

6 个答案:

答案 0 :(得分:7)

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

std::map定义为使用std::less(仅std::less) 默认情况下,std::less被定义为默认使用<。一般来说, 但是,我建议重载operator<,除非 有序比较对你的班级有意义,在这种情况下,你应该 以连贯的方式超载所有六个比较运算符。 否则,您可以指定比较功能类型作为附加功能 模板参数std::map;比较功能对象应该 定义严格的弱排序关系。如果类型设计为 用作键,但顺序仍然纯粹是任意的,你可以 专门化std::less

至于Java,没有运算符重载,显然不能使用<; 默认情况下,SortedMap(Java等效于std::map)需要 然而,键是可比较的,而这又需要compare function,返回值<==> 0,具体取决于是否 this {}为<==>。我承认我发现了这个 更合乎逻辑,但差异非常非常小。 (该 C ++决策背后的基本原理是内置类型,如intdouble可用作键。在Java中,你必须打包它们。)

答案 1 :(得分:3)

C ++标准对std::map的要求意味着它被实现为自平衡二进制搜索树。这意味着必须在元素之间进行某种排序比较。如果是std::map,则要求为strict weak ordering,默认值为低于比较值。这是在二叉树中排列元素所需的全部,当一个元素(称为A)不小于另一个元素(称为B)时,满足相等条件,并且反过来也是如此,即B是不小于A.可以使用相等比较,但这会产生一些不一致的范围。如果查看哈希表,例如std::unordered_map,您会发现确实需要进行相等比较,尽管这只是为了解决冲突。

答案 2 :(得分:1)

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

类似算法的一个很好的例子是Binary Search。正如您在示例伪代码中看到的那样,它根本不使用identity运算符。

答案 3 :(得分:1)

由于std::map<T, U>具有此类行为,因此它会使用std::less<T>仿函数或您的仿函数进行许多操作。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

不需要单独的operator ==,因为它是以operator <实现的,a==b相当于!a<b && !b<a