Я могу использовать карту stl, если я планирую использовать произвольные объекты класса в качестве ключа?

Ну, это - Xml. Возможно 


5
задан Kirill V. Lyadvinsky 4 September 2009 в 17:31
поделиться

4 ответа

std :: map имеет третий аргумент шаблона, после ключа и значения, чтобы указать, какая функция будет использоваться для сравнения ключей. По умолчанию это std :: less , который, в свою очередь, использует operator <. Так что, если в вашем классе есть оператор <, ничего страшного, иначе вы можете предоставить собственный компаратор.

9
ответ дан 18 December 2019 в 07:30
поделиться

Все, что вам нужно, это определить 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 для сравнения.

7
ответ дан 18 December 2019 в 07:30
поделиться

Да, вы можете использовать свой собственный тип / объект в качестве ключа. Им придется реализовать оператор «меньше» (operator <), поскольку все упорядоченные стандартные контейнеры C ++ действительно используют этот оператор для проверки порядка и равенства.

2
ответ дан 18 December 2019 в 07:30
поделиться

Полный тип для карты -

template < class Key, class T, class Compare = less<Key>,
       class Allocator = allocator<pair<const Key,T> > > class map;

. Он использует меньше, чем по умолчанию, но пока вы передаете класс, у которого есть перегруженный оператор (), чтобы взять два экземпляра объекта и вернуть bool, все в порядке.

3
ответ дан 18 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: