“ <”满足严格的弱排序是否意味着不需要“ ==”定义?

时间:2018-07-05 06:23:44

标签: c++

我对严格弱排序背后的数学知识并不了解。但是我读了一些东西:

  

满足严格弱排序的运算符可以表示所有其他   逻辑运算符

<(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个(如果很容易找到)标准库基于<定义其他运算符的示例吗?引用源代码就足够了。

3 个答案:

答案 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关系的完美示例。