Используйте typedefs классов STL, таких как map, list и т. Д. - PullRequest
0 голосов
/ 28 марта 2011

В текущем проекте я программирую на C ++ и довольно часто использую карту классов STL, набор и список. Теперь мне интересно, есть ли способ очистить некоторый код с помощью внутренних типов данных. Например:

std::map<uint64_t, std::list<int32_t> > mymap;
// add something to the map
for (std::map<uint64_t, std::list<int32_t> >::const_iterator it = mymap.begin (); it != mymap.end (); it++) {
    // iterate here
}

Мой вопрос: могу ли я заменить std::map<uint64_t, std::list<int32_t> >::const_iterator например? на mymap.const_iterator, но это не компилируется. Цитировать g ++ здесь:

error: invalid use of ‘std::map<long long unsigned int, std::list<int, std::allocator<int> >, std::less<long long unsigned int>, std::allocator<std::pair<const long long unsigned int, std::list<int, std::allocator<int> > > > >::const_iterator’

Есть идеи, как это сделать? Или это невозможно?

Ответы [ 3 ]

6 голосов
/ 28 марта 2011
typedef std::map<uint64_t, std::list<int32_t> > mymaptype;
mymaptype mymap;
for (mymaptype::const_iterator ...
3 голосов
/ 28 марта 2011

Если ваш компилятор поддерживает ключевое слово auto, используйте это. Например. Visual Studio 2010 и GCC 4.3 и выше поддерживают его.

std::map<uint64_t, std::list<int32_t> > myMap;
for(auto it = myMap.begin(); it != myMap.end(); ++it){
  // iterate...
}
0 голосов
/ 28 марта 2011

Это прекрасно работает для меня

typedef std::map<uint64_t, std::list<int32_t> >::iterator my_map;
std::map<uint64_t, std::list<int32_t> > mymap;
for (my_map it = mymap.begin (); it != mymap.end (); it++)
{
    // iterate here
}
...