Ваша карта, std::map<ElementType*, std::list<ElementType*> >
использует std::less
для типа ключа в качестве компаратора, как обычно.
std::less
для типов указателей определено для создания согласованного порядка, но порядок основан на адрес только , а не на что-либо, на что он может указывать.
Итак, ваш набор сортирует свое содержимое в соответствии с operator<
в Element
, но карта сортирует их в соответствии сфактическое значение указателя ключа.Это, вероятно, не то, что вам нужно: (1) различные объекты Element<int>
, содержащие одно и то же значение m_Label
, действуют как разные ключи на карте, и (2) это означает, что карта будет в другом порядке по сравнению сзадавать.Но std::map
может использовать дополнительный аргумент шаблона для предоставления компаратора, поэтому вы можете изменить его.
Вы можете написать компаратор, который берет два указателя и сравнивает объекты, на которые они указывают.Это предполагает, конечно, что, как только вы используете указатель в качестве ключа на карте, вы гарантируете, что объект, на который он указывает, остается (в set
, я полагаю, но если нет, тогда вставьте шаблонную лекцию о shared_ptr
Вот).Поскольку копировать Element<int>
дешево, почти наверняка лучше использовать ElementType
в качестве ключа вместо ElementType*
.Но если int
просто стоит за чем-то, что вы будете использовать в будущем, которое будет дорого копировать, то измените компаратор map
.
Возможно, вам не важен порядок элементов в map
,Если вы этого не сделаете, и если единственное, что вы когда-либо просматривали в map
, - это указатели на объекты в set
, то использование ElementType*
в качестве ключа карты без указания компаратора должно подойти.