我不太了解严格弱排序背后的数学原理。但我读过一些东西:
An operator that satisfies strict weak ordering can express all other logical operators
<(a, b) : (a < b) <=(a, b): !(b < a) ==(a, b): !(a < b) && !(b < a) !=(a, b) : (a < b) || (b < a) >(a, b) : (b < a) >=(a, b): !(a < b)
那么是不是就不需要“==”的定义了,因为“<”满足严格的弱排序,可以表达所有的逻辑运算符? (这显然看起来不正确,因为我已经看到类同时定义了 <
和 ==
。)
一个易于理解的解释也将不胜感激 :D。不必过于“数学”或“技术正确”。
谁能给我 1 或 2 个(如果很容易找到的话)标准库基于 <
定义其他运算符的示例?引用源代码就足够了。
最佳答案
要事第一。定义 operator <
并不意味着您得到了 operator ==
的定义从编译器免费。它仍然需要明确定义。
上表假设某些类型和排序关系适用,但并非适用于所有类型和顺序关系。它假定两个元素之间的等价意味着相等。这不需要成立。
我们当然可以使用<
检查两个元素之间的等价性。根据严格的周排序,它们是等价的(这就是 !(a < b) && !(b < a)
的意思)。这并不一定意味着这些元素是相等的。
一个很好的例子是字符串之间不区分大小写的比较。在那种情况下,我们肯定会有 !("ab" < "AB") && !("AB" < "ab")
, 这两个字符串是等价的,但它们的值不相等。
说了这么多。如果您定义的顺序关系暗示了您的类型的所有其他顺序关系,there are tricks从中生成所有其他操作。正如表格所示。
关于c++ - "<"是否满足严格的弱排序意味着不需要 "=="定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51184545/