C ++ перебирает шаблон Map - PullRequest
       18

C ++ перебирает шаблон Map

4 голосов
/ 07 декабря 2011

Когда у меня есть шаблонный класс, который содержит шаблонную карту и const_iterator, объявленный как в следующем коде typedef, как я могу перебирать элементы карты вне класса, например, в main, чтобы напечатать ихвыход?

template<class K, class V>
class template_map{
private:

    typedef typename std::map<K,V> TMap;
    TMap my_map;

public:
    typedef typename TMap::const_iterator const_iterator;
    ...
};

int main()
{

template_Map<int,double> Map1 //suppose that contains elements

?
}

Обновление: Можно ли использовать итератор typedef вне класса?Если да, то каким образом?

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Вам необходимо определить функции-члены в вашем шаблоне, которые будут возвращать итераторы:

template<class K, class V>
class template_map{

private:

typedef typename std::map<K,V> TMap;
TMap my_map;

public:
    typedef typename TMap::const_iterator const_iterator;
    const_iterator begin() const { return my_map.begin(); }
    const_iterator end() const   { return my_map.end(); }
};

Тогда:

int main()
{
    template_map<int, int> m;
    // Populate map...

    // Then iterate...
    for (auto i = m.begin(); i != m.end(); i++)
    {
    }
}

Однако я не уверен, что вы добавляете к std::map здесьпочему бы просто не использовать его как есть?

1 голос
/ 07 декабря 2011

Добавление элементов begin () и end () в template_Map (как константные, так и неконстантные варианты).

const_iterator begin() const {
    return my_map.begin();
}
const_iterator end() const {
    return my_map.end();
}
iterator begin() {
    return my_map.begin();
}
iterator end() {
    return my_map.end();
}

Я добавил неконстантные версии только для полноты интерфейса, в вашем случае это может не потребоваться. Чем в основном:

typedef template_Map<x, y> template_MapXY;
template_MapXY Map1;
...
for ( template_MapXY::const_iterator it( Map1.begin() ), end( Map1.end() ); it != end; ++ it ) {
     ...
}
0 голосов
/ 07 декабря 2011

Я не понимаю, почему вы хотите обернуть класс map другим. Почему ты не std::map сам?

Итерация по std::map обычно выполняется следующим образом:

for(std::map<mykey, myvalue>::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
    somevar = it->first; // <<--- points to your key
    someothervar = it->second; // points to your value
}
...