std :: map
имеет третий аргумент шаблона, после ключа и значения, чтобы указать, какая функция будет использоваться для сравнения ключей. По умолчанию это std :: less
, который, в свою очередь, использует operator <
. Так что, если в вашем классе есть оператор <, ничего страшного, иначе вы можете предоставить собственный компаратор.
Все, что вам нужно, это определить operator <
для MyClassObj
. Для получения дополнительной информации о std :: map вы можете прочитать здесь .
Согласно Стандарту C ++ 23.1.2:
Фраза «эквивалентность ключей» означает отношение эквивалентности, наложенное сравнением а не оператор == на клавишах. То есть два ключа k1 и k2 считаются эквивалентными, если для сравнения объект comp, comp (k1, k2) == false && comp (k2, k1) == false.
По умолчанию comp
равно std :: less
.
Согласно стандарту C ++ 20.3.3:
шаблон <класс T> struct less: binary_function
{ логический оператор () (const T & x, const T & y) const; }; // operator () возвращает x
Конечно, вы могли бы определить автономный функтор comp
для сравнения.
Да, вы можете использовать свой собственный тип / объект в качестве ключа. Им придется реализовать оператор «меньше» (operator <), поскольку все упорядоченные стандартные контейнеры C ++ действительно используют этот оператор для проверки порядка и равенства.
Полный тип для карты -
template < class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key,T> > > class map;
. Он использует меньше, чем по умолчанию, но пока вы передаете класс, у которого есть перегруженный оператор (), чтобы взять два экземпляра объекта и вернуть bool, все в порядке.