Набор STL и карта для того же определенного пользователем типа - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть класс, для которого я определил оператор сравнения. Ниже приведен код, который я написал

#include <set>
#include <map>
#include <list>

    template <typename _TyV>
    class Element {
    public:
        Element(_TyV in) :  m_Label(in){}
        ~Element() {}
        bool operator < ( const Element & right) const {
            return m_Label < right.m_Label;
        }
    private:
        _TyV m_Label;
    protected:
    };
    typedef Element<int> ElementType;

    int main ( int argc, char **argv) { 
        std::set<ElementType> mySet;
        for ( int i = 0; i < 10; i++) {
            mySet.insert(ElementType(i));
        }
        std::map<ElementType*, std::list<ElementType*> > myMapList;
        return 0;
    }

Я не совсем понимаю, как будет работать мой std::map, поскольку интересующий меня элемент std::map является указателем на ElementType. На самом деле я хочу сохранить фактические данные в std::set и использовать указатели на эти элементы в std::map

Большая путаница вокруг less than operator

1 Ответ

7 голосов
/ 27 сентября 2011

Ваша карта, 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* в качестве ключа карты без указания компаратора должно подойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...