std::map<K,D>
должен уметь сортировать. По умолчанию используется std::less<K>
, для использования без указателей <
.
Используя правило, что вы требуете как минимум вы можете от пользователей, синтезирует «эквивалентность» из <
, когда ему это нужно (!(a<b) && !(b<a)
означает a
и b
эквивалентны, то есть, ни меньше, чем другие).
Это упрощает создание классов для использования в качестве ключевых компонентов для map
, что кажется хорошей идеей.
Есть std
контейнеры, которые используют ==
такие как std::unordered_map
, который использует std::hash
и ==
. Опять же, они спроектированы так, чтобы они требовали от своих пользователей меньше всего - вам не нужен полный заказ для контейнеров unordered_
, просто эквивалент и хороший hash
.
Как это бывает, очень легко написать <
, если у вас есть доступ к <tuple>
.
struct Address {
long m_IPv4Address;
bool isTCP;
bool operator< (const Address& o) const {
return
std::tie(m_IPv4Address, isTCP)
< std::tie(o.m_IPv4Address, o.isTCP);
}
};
который использует std::tie
определенные в <tuple>
для создания надлежащего <
для вас.std::tie
берет кучу данных и генерирует tuple
ссылок, которые имеют уже существующий <
.
Для указателей, он использует некоторые сравнения, которые совместимы с <
, где указано <
поведения, и ведут себя хорошо, когда <
нет. Это действительно имеет значение для сегментированной модели памяти и других неясных архитектур.
Если '! (A jrok
, если вы знаете, как сравнивать с '<', тогда все остальные могут быть сгенерированы. проверьте [здесь] (http://stackoverflow.com/q/23388739/4224575) –
@jrok: Не обязательно. Они эквивалентны по отношению к упорядочению, но только равны, если согласуется определение 'operator =='. –