我对严格弱排序背后的数学知识并不了解。但是我读了一些东西:
满足严格弱排序的运算符可以表示所有其他 逻辑运算符
<(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个(如果很容易找到)标准库基于<
定义其他运算符的示例吗?引用源代码就足够了。
答案 0 :(得分:7)
第一件事是第一位。定义operator <
并不意味着您可以从编译器免费获得operator ==
的定义。它仍然需要明确定义。
上表假设对许多类型和顺序关系都适用,但并非对所有情况都适用。它假定两个元素之间的等效意味着相等。那不必成立。
我们当然可以使用<
来检查两个元素之间是否相等。根据严格的星期顺序,它们是等效的(这就是!(a < b) && !(b < a)
的含义)。不一定表示这些元素相等。
一个很好的例子是字符串之间不区分大小写的比较。在这种情况下,我们肯定会有!("ab" < "AB") && !("AB" < "ab")
,并且两个字符串是等效的,但是它们的值并不相等。
说了这么多。如果您定义的顺序关系隐含您类型的所有其他关系,请there are tricks从中生成所有其他操作。如表所示。
答案 1 :(得分:3)
那么这是否意味着不需要“ ==”定义?
如果希望班级的客户使用它,则仍需要定义它。可以使用<
运算符来实现。就==
运算符而言,实现<
运算符可能会更容易。但是,出于性能方面的考虑,最好自己干净地实现它。
答案 2 :(得分:2)
从代数结构的角度来看,存在一种称为“ Partially Ordered Set”的二进制关系。部分有序集被定义为自反,反对称和可传递的二元关系。
在C ++中,可以将bool operator<(a, b)
实现为POS关系运算符。在这种情况下,!(a < b) && !(b < a)
很难被认为等同于平等。一个可能的实现是测试一个节点是否是另一个节点的后代。这是POS关系的完美示例。