更大的运算符">"满足严格的弱排序吗?

Does greater operator ">" satisfy strict weak ordering?

本文关键字:排序 运算符 gt 满足      更新时间:2023-10-16

定义

<为二元关系,其中a < b表示"a小于b"。

>为二元关系,其中a > b表示"a大于b"。

因此,我们假设<>具有我们通常在日常生活中使用的含义。然而,在一些编程语言(例如C++(中,我们可以重载它们以给它们不同的定义,此后我们不再考虑这一点。


上下文

就我阅读严格弱序的数学定义(例如维基百科(而言,我认为<>都满足了它。然而,我在许多网站上看到的所有例子都只涉及<。甚至有一个网站说

他们的大致意思是,严格弱序必须以"小于"的行为方式表现:如果a小于b,则b不小于a,如果a小于b且b小于c,则a小于c,依此类推


此外,在N4140(C++14国际标准(中,严格弱排序被定义为

(§25.4-4(如果我们将equiv(a, b)定义为!comp(a, b) && !comp(b, a),则要求compequiv都是传递关系

其中comp定义为

(§25.4-2(Compare是一个函数对象类型(20.9(。应用于Compare类型对象的函数调用操作的返回值,当上下文转换为bool时(第4条(,如果调用的第一个参数小于第二个参数,则产生true,否则产生falseCompare comp始终用于算法假定为排序关系。


问题

">"是否满足严格弱序?我希望如此,但没有信心。

大运算符">"满足严格弱排序吗?

数学上的严格大于关系是一个严格的弱排序。

对于C++语言中的运算符:对于所有整数类型:是。一般来说:没有,但在大多数情况下是的。同样适用于严格小于运算符。


至于令人困惑的引号,"小于">在该上下文中旨在传达这意味着排序操作的最终结果是一个非递减序列,即对象"小于"或等于后面的对象。如果使用std::greater作为比较对象,则值越大,则按顺序"越小"。

这可能会让人感到困惑,但并不是要排除严格大于运算符。


不满足严格弱序的情况是什么?

一些例子:

  • 重载了不满足属性的运算符
  • 不指向同一数组的指针上的>运算符具有未指定的结果
  • >不满足IEEE-754表示中浮点类型的不可伸缩性要求,除非NaN被排除在域之外

即使标准对任意Compare函数引用"小于",在排序的上下文中也只意味着"小于">

如果我通过比较函数[](int a, int b) { return a > b; }定义了一个排序,那么如果一个元素的整数值大于,则该排序中的一个元素"小于"另一个元素。这是因为我创建的排序是整数的逆序排序。您不应该在排序中将<读作"小于"。你应该把它读成"之前"。

每当x < y是严格弱序时,x > y也是严格弱序,只是具有相反的顺序。