有人可以解释一下,重载==
和<
之间的区别是什么?
例如,如果我使用地图:
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
,并且理解行为非常简单。
感谢。
答案 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 ++决策背后的基本原理是内置类型,如int
或
double
可用作键。在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