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

Does "<" satisfies strict weak ordering means that there's no need for "==" definition?

本文关键字:是否 意味着 不需要 排序 定义 lt 满足      更新时间:2023-10-16

我对严格弱排序背后的数学了解不多。但我读过一些东西:

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

<(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"),并且两个字符串是等价的,但它们的值不相等。

说了这么多。如果您定义的顺序关系意味着您的类型的所有其他顺序关系,则有一些技巧可以从中生成所有其他操作。正如表格所示。

那么这是否意味着不需要"=="定义?

如果您希望类的客户端使用它,您仍然需要定义它。它可以在<运算符方面实现。就<运算符而言,实现==运算符可能更容易。但是,出于性能原因,最好单独干净地实现它。

从代数结构的角度来看,有一种二元关系称为"偏序集合"。偏序集合被定义为自反、反对称和传递的二元关系。

在C++中,可以将bool operator<(a, b)实现为POS关系操作员。在这种情况下,!(a < b) && !(b < a)很难被视为等同于平等。一种可能的实现是测试一个节点是否是另一个节点的后代。这是POS关系的完美示例。