Оператор <и строгий слабый порядок

Как определить operator< на n-кортеж (например, на 3-кортеже), чтобы он удовлетворял строгой концепции слабого упорядочения ? Я знаю, что библиотека boost имеет class кортежа с правильно определенным operator< но по некоторым причинам я не могу его использовать.

 if (a1 < b1) return true; if (b1 < a1) return false; // a1==b1: continue with element 2 if (a2 < b2) return true; if (b2 < a2) return false; // a2 == b2: continue with element 3 if (a3 < b3) return true; return false; // early out 

Это упорядочивает элементы с помощью a1, являющегося наиболее значимым, и a3 наименее значимым.

Это можно продолжить до бесконечности, вы также можете применить его к вектору T, итерации по сравнению с [i]

 while (i 

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


[edit] удаленный неправильный код

строгий слабый порядок

Это математический термин для определения отношения между двумя объектами.
Его определение:

Два объекта x и y эквивалентны, если оба f (x, y) и f (y, x) ложны. Заметим, что объект всегда (по инварианту нерефлексивности) эквивалентен самому себе.

В терминах C ++ это означает, что если у вас есть два объекта данного типа, вы должны вернуть следующие значения по сравнению с оператором <.

 X a; X b; Condition: Test: Result a is equivalent to b: a < b false a is equivalent to bb < a false a is less than ba < b true a is less than bb < a false b is less than aa < b false b is less than ab < a true 

То, как вы определяете эквивалент / меньше, полностью зависит от типа вашего объекта.

Проверьте страницу SGI на тему:
http://www.sgi.com/tech/stl/StrictWeakOrdering.html

… новый ответ на очень старый вопрос, но существующий ответ пропустил простое решение из C ++ 11 …

Решение C ++ 11

C ++ 11 обеспечивает std::tuple , который вы можете использовать для хранения ваших данных. tuple имеет соответствующий operator< который первоначально сравнивает самый левый элемент, а затем работает по кортежу, пока результат не станет ясным. Это подходит для обеспечения строгого слабого упорядочения, ожидаемого, например, std::set и std::map .

Если у вас есть данные в некоторых других переменных (например, в полях в struct ), вы можете даже использовать std::tie() для создания кортежа ссылок , который затем можно сравнить с другим таким кортежем. Это упрощает запись operator< для конкретных полей данных элемента в пользовательском class / struct :

 struct My_Struct { int a_; double b_; std::string c_; }; bool operator<(const My_Struct& lhs, const My_Struct& rhs) { return std::tie(lhs.a_, lhs.b_, lhs.c_) < std::tie(rhs.a_, rhs.b_, rhs.c_); } 

Вы могли бы просто использовать трехэлементные векторы, у которых уже будет определен оператор <(). Это имеет то преимущество, что оно распространяется на N-элементы без необходимости делать что-либо.

Основной stream должен быть по строкам: если элементы Kth различны, возврат, который меньше остальных, переходит к следующему элементу . В приведенном ниже коде предполагается, что у вас нет бут-кортежа, иначе вы бы использовали get(tuple) и не имели проблемы для начала.

 if (lhs.first != rhs.first) return lhs.first < rhs.first; if (lhs.second != rhs.second) return lhs.second< rhs.second; return lhs.third < rhs.third; 

Даже если вы не можете использовать ускоренную версию, вы сможете пропустить код. Я отказал это от std :: pair – 3 кортежа будут похожи, я думаю.

 return (_Left.first < _Right.first || !(_Right.first < _Left.first) && _Left.second < _Right.second); 

Изменить: как заметили пара людей, если вы украли код из стандартной библиотеки для использования в своем коде, вы должны переименовать вещи, у которых есть подчеркивания спереди, поскольку эти имена зарезервированы.

Interesting Posts

Вычисление разницы во времени hh: mm: ss format

«Пространства» или несколько рабочих столов для одного монитора в системе Multi-Monitor?

Как загрузить фотографию на сервер с помощью iPhone?

Приложение Rails не обслуживает активы в производственной среде

Может ли функция onprogress быть добавлена ​​в jQuery.ajax () с помощью xhrFields?

Попытка установить ОС на новый компьютер; Не обнаружит HDD

Почему Apple отказывается от OpenSSL в MacOS 10.7 (Lion)?

Как получить полный путь к ресурсу в Windows?

XPath – Разница между узлом () и текстом ()

Пользовательский текст UINavigationController “назад”?

Как перенести содержимое моего портативного Firefox в установленный Firefox на моем ноутбуке?

Что такое многоуровневый кеш в процессорах?

Выделить (затенение) сюжетный фон в определенном временном диапазоне

Прокрутка двумя пальцами с помощью UIScrollView

Ошибка «Диспетчер Struts не может быть найден» при развертывании приложения на WebLogic 12.1.3

Давайте будем гением компьютера.