【问题标题】:Stroustrup on comparisons, errata?Stroustrup 进行比较,勘误?
【发布时间】: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++


【解决方案1】:

这不是勘误表。

equiv(x,y) := !(cmp(x,y)||cmp(y,x))
x := x
y := x

substituting in:
!((x < x) || (x < x))
!((false) || (false))
!(false)
true

【讨论】:

    【解决方案2】:

    能否改为如下定义?

    cmp&lt;=equiv(x,y) = (cmp(x,y) &amp;&amp; cmp(y,x))

    是的,这也为您提供了一致的定义。

    应该改为如下定义吗?

    它并不比我们使用的定义好,所以我建议no,主要是因为有大量现有代码是为当前定义编写的。

    而不是Compare的当前定义

    比较是一些标准库工具对用户提供的函数对象类型所期望的一组要求。

    应用于满足比较类型的对象的函数调用操作的返回值,当上下文转换为bool时,如果调用的第一个参数出现在在这种类型引起的严格弱序关系中排名第二,否则false

    • 所有acmp(a,a)==false
    • 如果cmp(a,b)==true 那么cmp(b,a)==false
    • 如果cmp(a,b)==truecmp(b,c)==true 那么cmp(a,c)==true

    应该是

    应用于满足比较类型的对象的函数调用操作的返回值,当上下文转换为bool时,如果调用的第一个参数出现在在这种类型引起的严格弱序关系中排名第二,否则true

    • 所有acmp(a,a)==true
    • 如果cmp(a,b)==false 那么cmp(b,a)==true
    • 如果cmp(a,b)==truecmp(b,c)==true 那么cmp(a,c)==true

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多