【发布时间】:2020-07-28 14:19:16
【问题描述】:
在 Stroustrup C++ 第 4 版第 891 页,其中描述了比较属性。他解释说,对于严格的弱排序,函数cmp 可以用小于< 来表示。我对他对“等价传递性”的如下解释感到困惑;
等价的传递性:定义 equiv(x,y) 为 !(cmp(x,y)||cmp(y,x))。如果 equiv(x,y) 和 equiv(y,z),则 equiv(x,z)。 最后一条规则允许我们在需要 == 时将相等 (x==y) 定义为 !(cmp(x,y)||cmp(y,x))。
是否应该改为如下定义?
cmp 是 <= 和 equiv(x,y) = (cmp(x,y) && cmp(y,x))
感谢您的指导。
【问题讨论】:
-
我认为重点是
<=不是严格的弱排序,但<是。因此,如果您已经拥有<(因为您需要严格的弱排序),那么按照所述定义==很容易。 -
<=是非严格的。我看不出他对equiv的定义在严格的弱排序<下是如何正确的。 -
没错,有小于、等于、大于三种可能。
!(cmp(x,y)||cmp(y,x))说第一个或第三个不是真的。因此只剩下第二种可能性。 -
@john 有四种可能性,你错过了“无与伦比”。 OP 可能缺少的是 Stroustrup 只谈论 total 排序,然后(并且只有这样)“无与伦比”作为选项消失。
-
@orlp Any 严格的弱排序在由关系
equiv(x,y)=!(cmp(x,y)||cmp(y,x))定义的一组等价类上引起全排序。最初的 SWO 不需要是总的,而且通常不是。
标签: c++