可能有人给我解释一下什么是过载的区别==
和<
?
例如,如果我使用贴图:
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
被调用,是相当容易理解的行为。
谢谢。
operator==
重载==
操作(并且没有其他); operator<
重载<
算子(并且没有其他)。
std::map
定义为使用std::less
(且仅std::less
)由缺省,和std::less
定义为使用<
默认情况下。 但一般情况下,我会建议不要超载operator<
除非下令比较有意义的类,在这种情况下,你应该重载全部六种比较运算,以连贯方式。 否则,你可以指定一个比较功能型作为一个额外的模板参数std::map
; 比较功能对象应该定义一个严格弱序关系。 如果类型是设计用来作为重点,但排序还是纯粹是任意的,你可能会专注std::less
。
至于Java的,没有操作符重载,这显然不能用<
; 默认情况下, SortedMap
(在Java相当于std::map
)要求的钥匙是可比,但是,这又需要一个compare
功能,它返回一个值<
, ==
或>
0,这取决于是否this
是<
, ==
或>
以外。 我得承认,我觉得这一点更符合逻辑,但不同的是非常非常小。 (该C ++决策背后的理由是,内置的类型,如int
或double
可以用作密钥。在Java中,you'ld有框它们)。
该要求的C ++标准的地方标准::地图意味着它是一个平衡树实现。 这意味着某种元素之间的排序比较的必须是可用的。 在的情况下std::map
的要求是严格的弱序 ,默认是小于比较。 这是所有需要安排在二叉树的元素,和平等条件满足时,一个元素(称为A)不小于另一个(称之为B),而反过来也是如此,即B是不低于A.相等比较可能已被使用,但是这会开一些余地不一致。 如果你看一下哈希表,如性病:: unordered_map ,你会发现一个平等的比较的确是必需的,尽管这只是解决冲突。
运营商<
是必要的,因为在内部实现地图的查找操作基地(在树上)。 为了能够在复杂性比线性更好地发现,它不能与每一个元素进行比较。
类似的算法的一个很好的例子是二进制搜索 。 正如你可以在样伪看到,它不使用的身份运营商都没有。
因为std::map<T, U>
有这样的行为,它使用std::less<T>
仿函数或仿函数的许多操作。
行为可以是不同的,但通常会检查LHS小于RHS。
大概是因为地图是作为一个平衡树。 如果你需要一个哈希表使用unordered_map。
std::map
是一个有序的容器,因此它需要一个operator <
定义元素的顺序。
一个单独的operator ==
不需要,因为它是在以下方面实现的operator <
, a==b
等效于!a<b && !b<a