Соответствует ли больший оператор ">" строгому слабому порядку? - PullRequest
6 голосов
/ 22 октября 2019

Определение :

Пусть < будет бинарным отношением, где a < b означает "a меньше b".

Пусть > будет бинарным отношением, где a > b означает "a больше b".

Итак, мы предполагаем < и > имеют значения, которые мы обычно используем в повседневной жизни. Хотя в некоторых языках программирования (например, C ++) мы можем перегружать их, чтобы дать им разные определения, в дальнейшем мы не думаем об этом.


Context :

Поскольку я читаю математическое определение строгого слабого порядка (например, Википедия ), я думаю, что и <, и > удовлетворяют его. Однако все примеры, которые я видел на многих сайтах, относятся только к <. Существует даже веб-сайт , на котором написано

, что примерно означает, что строгий слабый порядок должен вести себя так, как ведет себя «меньше, чем»: если 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 используется повсеместно для алгоритмов, предполагающих отношение порядка.


Вопрос :

Соответствует ли ">" строгому слабому порядку? Я ожидаю, но не уверен.

Ответы [ 2 ]

5 голосов
/ 22 октября 2019

Удовлетворяет ли строгий слабый порядок больший оператор «>»?

Математическое строгое отношение больше - строгий слабый порядок.

Что касается оператора в C ++langauge: для всех целых типов: да. В целом: нет, но в большинстве случаев да. То же самое относится к строгому оператору «меньше, чем».


Что касается запутанной цитаты, "меньше" в этом контексте намеревается передать, что означает, что конечный результат сортировкиоперация - это неубывающая последовательность, т.е. объекты «меньше» или равны объектам после них. Если std::greater используется в качестве объекта сравнения, тогда большие значения имеют «меньший» порядок.

Это может сбивать с толку, но не предназначено для исключения строгого оператора больше.


в каком случае> не удовлетворяет строгому слабому порядку?

Некоторые примеры:

  • Перегруженные операторы, которые не удовлетворяют свойствам. *Оператор 1025 *
  • > для указателей, которые не указывают на один и тот же массив, имеет неопределенный результат.
  • > не удовлетворяет требованию нерефлексивности для типов с плавающей запятой в представлении IEEE-754, если только NaN не исключеныс домена.
5 голосов
/ 22 октября 2019

Даже если в стандарте упоминается «меньше чем» для произвольных Compare функций, это подразумевает «меньше чем» в контексте порядка .

Если я определяюупорядочивая по функции сравнения [](int a, int b) { return a > b; }, тогда элемент «меньше» другого в этом порядке, если его целочисленное значение больше. Это потому, что порядок, который я создал, представляет собой порядок целых чисел в обратном порядке . Вы не должны читать < как "меньше чем" в заказах. Вы должны читать это как «предшествует».

Всякий раз, когда x < y является строгим слабым порядком, тогда x > y также является строгим слабым порядком, просто с обратным порядком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...