较大的运算符“>”是否满足严格的弱排序?

ynn*_*ynn 6 c++ algorithm language-lawyer strict-weak-ordering

定义

<二元关系,其中的a < b意思是“ a小于b”。

>二元关系,其中a > b“” a大于b“。

因此,我们假设<>具有我们通常在日常生活中使用的含义。但是,在某些编程语言(例如C ++)中,我们可以重载它们以给它们提供不同的定义,此后我们就不用考虑了。


内容

至于我读的数学定义严格弱序(如维基百科),我认为无论是<>satify它。但是,我在许多网站上看到的所有示例仅涉及<。甚至有一个网站

它们的大致含义是:严格弱排序必须按照“小于”的行为进行操作:如果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),则要求是comp并且equiv都必须是传递关系

在哪里comp定义为

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


问题

“>”是否满足严格的弱排序?我期望如此,但没有信心。

orl*_*rlp 5

即使标准将任意Compare功能称为 “小于” ,在排序的上下文中也仅表示“小于” 。

如果我通过比较函数定义一个排序[](int a, int b) { return a > b; },则如果该元素的整数值较大,则此元素“小于”另一个排序。那是因为我创建的顺序是相反顺序的整数顺序。您不应<在订单中读为“小于”。您应该将其阅读为“以前来过”。

只要x < y是严格的弱排序,然后x > y就是严格的弱排序,只是带有相反的顺序。


eer*_*ika 5

大运算符“>”是否满足严格的弱排序?

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

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


至于令人困惑的引用,在上下文中“小于”是要传达的意思,这意味着排序操作的最终结果是一个非递减序列,即对象“小于”或等于其后的对象。如果std::greater用作比较对象,则较大的值按顺序“较小”。

这可能会造成混淆,但并不旨在排除严格大于运算符。


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

一些例子:

  • 不满足该属性的运算符重载。
  • > 未指向同一数组的指针上的运算符具有未指定的结果。
  • > 除非将NaN排除在域外,否则不满足IEEE-754表示形式中浮点类型的不反身性要求。