6

定义

让我们<成为一个二元关系,其中a < b意味着“a小于b”。

让我们>成为一个二元关系,其中a > b意味着“a大于b”。

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


上下文

就我阅读严格弱排序的数学定义(例如Wikipedia)而言,我认为两者<兼而有之>。但是,我在许多网站上看到的所有示例都仅指<. 甚至有一个网站

他们大致的意思是严格的弱排序必须表现出“小于”的行为方式:如果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始终用于假设排序关系的算法。


问题

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

4

2 回答 2

6

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

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

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


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

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


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

一些例子:

  • 不满足属性的重载运算符。
  • >不指向同一数组的指针上的运算符具有未指定的结果。
  • >不满足 IEEE-754 表示中浮点类型的非自反性要求,除非从域中排除 NaN。
于 2019-10-22T17:40:15.820 回答
5

即使标准提到任意函数的“小于” ,也仅在 ordering 的上下文中Compare暗示“小于” 。

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

每当x < y是一个严格的弱排序,那么x > y也是一个严格的弱排序,只是顺序相反。

于 2019-10-22T17:39:03.893 回答