代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

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

c++
  •  3
  • Rick Jim DeLaHunt  · 技术社区  · 7 年前

    我不太了解严格弱序背后的数学原理。但我读到一些东西:

    满足严格弱序的算子可以表示 逻辑运算符

    <(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 回复  |  直到 7 年前
        1
  •  7
  •   StoryTeller - Unslander Monica    7 年前

    第一件事是第一件事。定义 operator < 并不意味着你得到了 operator == 从编译器那里免费获得。它仍然需要明确定义。

    上表假设许多类型和顺序关系都是正确的,但并非所有类型和顺序关系都是正确的。它假定两个元素之间的等价意味着相等。那不需要坚持。

    我们当然可以利用 < 检查两个元素之间的等价性。根据严格的周顺序,它们是等价的(这就是 !(a < b) && !(b < a) 手段)。这并不一定意味着这些元素是相等的。

    一个很好的例子是字符串之间不区分大小写的比较。如果那样的话,我们肯定会 !("ab" < "AB") && !("AB" < "ab") ,这两个字符串是等价的,但它们的值不相等。

    说了那么多。如果您定义的顺序关系表示您的类型的所有其他顺序关系, there are tricks 从中生成所有其他操作。正如表所示。

        2
  •  3
  •   R Sahu    7 年前

    那么这是否意味着不需要定义“==”呢?

    如果希望类的客户端使用它,则仍需要定义它。它可以根据 < 接线员。可能更容易实现 == 运营商 < 接线员。但是,出于性能原因,最好自己干净地实现它。

        3
  •  2
  •   iBug    7 年前

    从代数结构的角度看,有一种二元关系叫做 Partially Ordered Set “。偏序集定义为自反、反对称和传递性的二元关系。

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