C ++ ==超载和运营商之间差异(C++ overloading operators differ

2019-07-31 02:43发布

可能有人给我解释一下什么是过载的区别==<

例如,如果我使用贴图:

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被调用,是相当容易理解的行为。

谢谢。

Answer 1:

operator==重载==操作(并且没有其他); operator<重载<算子(并且没有其他)。

std::map定义为使用std::less (且仅std::less )由缺省,和std::less定义为使用<默认情况下。 但一般情况下,我会建议不要超载operator<除非下令比较有意义的类,在这种情况下,你应该重载全部六种比较运算,以连贯方式。 否则,你可以指定一个比较功能型作为一个额外的模板参数std::map ; 比较功能对象应该定义一个严格弱序关系。 如果类型是设计用来作为重点,但排序还是纯粹是任意的,你可能会专注std::less

至于Java的,没有操作符重载,这显然不能用< ; 默认情况下, SortedMap (在Java相当于std::map )要求的钥匙是可比,但是,这又需要一个compare功能,它返回一个值<==> 0,这取决于是否this<==>以外。 我得承认,我觉得这一点更符合逻辑,但不同的是非常非常小。 (该C ++决策背后的理由是,内置的类型,如intdouble可以用作密钥。在Java中,you'ld有框它们)。



Answer 2:

该要求的C ++标准的地方标准::地图意味着它是一个平衡树实现。 这意味着某种元素之间的排序比较的必须是可用的。 在的情况下std::map的要求是严格的弱序 ,默认是小于比较。 这是所有需要安排在二叉树的元素,和平等条件满足时,一个元素(称为A)不小于另一个(称之为B),而反过来也是如此,即B是不低于A.相等比较可能已被使用,但是这会开一些余地不一致。 如果你看一下哈希表,如性病:: unordered_map ,你会发现一个平等的比较的确是必需的,尽管这只是解决冲突。



Answer 3:

运营商<是必要的,因为在内部实现地图的查找操作基地(在树上)。 为了能够在复杂性比线性更好地发现,它不能与每一个元素进行比较。

类似的算法的一个很好的例子是二进制搜索 。 正如你可以在样伪看到,它不使用的身份运营商都没有。



Answer 4:

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

行为可以是不同的,但通常会检查LHS小于RHS。



Answer 5:

大概是因为地图是作为一个平衡树。 如果你需要一个哈希表使用unordered_map。



Answer 6:

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

一个单独的operator ==不需要,因为它是在以下方面实现的operator <a==b等效于!a<b && !b<a



文章来源: C++ overloading operators difference between == and <