2

==有人可以解释一下重载和之间有什么区别<吗?

例如,如果我使用地图:

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,并且很容易理解该行为。

谢谢。

4

6 回答 6

7

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

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

至于Java,没有运算符重载,显然不能使用<; 默认情况下,SortedMap(Java 等价于std::map)要求键是 Comparable 的,然而,这又需要一个compare 函数,该函数返回一个 value或0 <,具体取决于 is或not other。我承认我觉得这更合乎逻辑,但差异非常非常小。(C++ 决定背后的基本原理是内置类型,如or 可以用作键。在 Java 中,您必须将它们装箱。)==>this<==>intdouble

于 2012-08-22T09:36:52.123 回答
3

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

于 2012-08-22T09:41:14.533 回答
1

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

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

于 2012-08-22T09:25:07.083 回答
1

因为std::map<T, U>有这样的行为,它使用std::less<T>仿函数或你的仿函数进行许多操作。

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

于 2012-08-22T09:25:53.420 回答
0

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

于 2012-08-22T09:27:04.787 回答
0

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

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

于 2012-08-22T09:39:23.233 回答