Такое сравнение называется лексикографическим порядком и является одним из наиболее естественных способов объединения двух разных порядков в один.
Упорядочения, которыезапрашиваемые в C ++ называются строгие слабые порядки .Это означает, что должно быть верно следующее:
- Нерефлексивность: x
- Транзитивность: Если x
- Антисимметрия: Если x
- Транзитивность эквивалентности: Если x и y несопоставимы, а y и z несравнимы, то x и z несопоставимы.
Эти свойства необходимы для гарантии того, что вы можете получить списокобъекты и положить их в отсортированном порядке возрастания.Это означает, что вы можете использовать std::sort
на них или хранить их в std::set
.
. Вы можете немного математически доказать, что если у вас два разных строгих слабых порядка, то лексикографический порядок васполучить, комбинируя их как std::pair
, также является строгим слабым порядком.Лексикографическое упорядочение - это один из немногих способов, которым вы можете комбинировать строгие слабые упорядочения для создания новых строгих слабых упорядочений.
Однако предложенный вами порядок упорядочения , а не строгий слабыйи приведет к нарушению определенных предположений.В частности, рассмотрим пары (0, 5), (3, 3) и (1, 6).Тогда (0, 5) несопоставимо с (3, 3) и (3, 3) несопоставимо с (1, 6).Однако у нас действительно есть то (0, 5) <(1, 6), что нарушает правило <em>транзитивности эквивалентности .В результате многие алгоритмы сортировки, которые предполагают, что эквивалентность является транзитивной (что включает в себя большинство основных алгоритмов сортировки), не будут корректно работать в вашем диапазоне, что означает, что std::sort
может работать неправильно.Это также означает, что вы также не можете сохранить их в std::set
, потому что std::set
хранит все вместе в некотором сортированном порядке (обычно это сбалансированное двоичное дерево поиска), и вы можете получить совершенно неправильные результаты.
Надеюсь, это поможет!