Правильным решением является специализация std::less
для вашего класса / структуры.
• В основном карты в cpp реализованы как деревья бинарного поиска.
- BST сравнивают элементы узлов, чтобы определить организацию дерева.
- Узлы, чей элемент сравнивается меньше, чем у родительского узла, размещаются слева от родительского узла, а узлы, элементы которых сравниваются больше, чем элемент родительских узлов, размещаются справа
т.е.
Для каждого узла: node.left.key
Каждый узел в BST содержит Элементы, а в случае карт его KEY и значение, а ключи А должны быть упорядочены.
Подробнее о реализации карты: Тип данных карты .
В случае карт cpp ключи являются элементами узлов, а значения не участвуют в организации дерева, это просто дополнительные данные.
Значит, ключи должны быть совместимы с std::less
или operator<
, чтобы их можно было упорядочить. Пожалуйста, проверьте параметры карты .
Иначе, если вы используете пользовательский тип данных в качестве ключей, необходимо указать полную семантику сравнения для этого типа данных.
Решение : Specialize std::less
:
Третий параметр в шаблоне карты является необязательным, и он std::less
, который будет делегировать operator<
,
Итак, создайте новый std::less
для вашего определенного пользователем типа данных. Теперь этот новый std::less
будет выбран по умолчанию std::map
.
namespace std
{
template<> struct less<MyClass>
{
bool operator() (const MyClass& lhs, const MyClass& rhs) const
{
return lhs.anyMemen < rhs.age;
}
};
}
Примечание. Вам необходимо создать специализированный std::less
для каждого определенного пользователем типа данных (если вы хотите использовать этот тип данных в качестве ключа для карт cpp).
Плохое решение:
Перегрузка operator<
для вашего пользовательского типа данных.
Это решение также будет работать, но его очень плохо, поскольку оператор <
будет перегружен повсеместно для вашего типа данных / класса. что нежелательно в клиентских сценариях.
Пожалуйста, проверьте ответ Ответ Павла Минаева