C++重载==和<之间的运算符差异;
C++ overloading operators difference between == and <
有人能解释一下过载==
和<
之间的区别吗?
例如,如果我使用地图:
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,理解行为非常简单。
谢谢。
operator==
重载==
运算符(没有其他运算符);operator<
重载CCD_ 10运算符(而不是其他运算符)。
std::map
被定义为使用std::less
(并且仅使用std::less
)并且std::less
被定义为默认使用<
。一般来说但是,我建议不要重载operator<
,除非有序比较对您的类是有意义的,在这种情况下,您应该以连贯的方式重载所有六个比较运算符。否则,您可以将比较函数类型指定为附加std::map
的模板参数;比较函数对象应该定义一个严格的弱序关系。如果该类型设计为用作密钥,但排序仍然完全是任意的,您可以专用CCD_ 18。
至于Java,如果没有运算符重载,它显然无法使用<
;默认情况下,SortedMap
(相当于std::map
的Java)需要然而,密钥是可比较的,这反过来又需要compare
函数,返回值<
、==
或>
0,具体取决于this
是<
、==
或>
。我承认我觉得这是稍微合乎逻辑一点,但差别非常非常小。(C++决策背后的基本原理是像int
或CCD_ 31可以用作密钥。在Java中,你必须把它们装箱。)
C++标准对std::map的要求意味着它被实现为一个自平衡的二进制搜索树。这意味着元素之间必须有某种排序比较。在std::map
的情况下,要求是严格的弱排序,默认情况下是小于比较。这就是在二叉树中排列元素所需的全部条件,当一个元素(称为a)不小于另一个元素时(称为B),满足相等条件,反之亦然,即B不小于a。可以使用相等比较,但这会为不一致性打开一些范围。如果您查看散列表,如std::unordered_map,您会发现确实需要进行相等比较,尽管这只是为了解决冲突。
需要运算符<
,因为find操作基于map(在树上)的内部实现。为了能够在复杂性上比线性更好地找到,它不必与每个元素进行比较。
类似算法的一个很好的例子是二进制搜索。正如您在示例伪代码中看到的,它根本不使用标识运算符。
因为std::map<T, U>
有这样的行为,所以它使用std::less<T>
函子或您的函子进行许多操作。
行为可能不同,但通常检查lhs是否小于rhs。
可能是因为map是作为一个平衡树实现的。如果需要哈希表,请使用unordered_map。
std::map
是一个有序容器,因此它需要一个operator <
来定义元素的顺序。
不需要单独的operator ==
,因为它是根据operator <
实现的,a==b
等效于!a<b && !b<a
- 构造函数和转换运算符之间的重载解析
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 你能帮我了解重载一元运算符和二进制运算符之间的区别吗?
- 赋值运算符之间的差(+=和=)
- C++ 字符串追加和运算符 += 之间的区别
- 为什么赋值运算符和相等运算符之间没有 1:1 的关系?
- "&&"运算符和"and"运算符之间的区别
- 显式运算符 = 调用和 = 运算符之间是否有区别
- 内部和外部过载C++运算符之间的差异
- 在运算符之间添加间距的目的是什么?
- 如何确保此 qi 解析器不允许点运算符之间的空格
- 点运算符和箭头运算符之间的区别 结构对象变量 在 C 或 C++ 中创建树
- :、::运算符之间的C++差异
- 函数调用中 * 和 & 运算符之间的区别
- C++中转换运算符之间的优先级
- QSharedPointer::isNull() 和运算符之间的区别!().
- istream的运算符之间的差异>>libc++和libstdc++之间的double&val)
- 复制构造函数和赋值运算符之间的区别
- C++ 中 += 和 =+ 运算符之间的差异
- 显式原子加载/存储与常用运算符=和运算符T之间的区别是什么