Эффективный способ ссылки на имя типа итератора без ввода всего определения контейнера?

Есть ли более эффективный способ ссылки на имя типа итератора контейнера, чем ввод

std::unordered_map<keyclass, valueclass>::iterator

каждый раз, когда мне нужен итератор?

Есть конечно

typedef boost::unordered_map<keyclass, valueclass>::iterator classitr

но введение typedef для каждого контейнера не кажется мне очень читабельным кодом.
Будучи новичком в C ++ и предполагая, что каждый обычно имеет ссылку на контейнер, который он хочет использовать — есть ли что-то вроде

Container<KeyClass, ValueClass> x;

x::iterator_type i

или любой другой очевидный ярлык, который мне не хватает?

2

Решение

Это одна из причин, почему C ++ 11 ввел новое значение auto ключевое слово:

auto it = vec.begin();

Компилятор определит тип it из инициализатора аналогично выводу типа шаблона.

До C ++ 11 обычным подходом было использование typedefКак вы и предлагали. Часто это может быть наиболее полезным для typedef контейнер, а затем дать все относительно этого:

typedef std::unordered_map<key, value> map;
map m;
map::iterator = m.begin();

Вы можете дать более осмысленное имя своему typedef это точно описывает, какого рода map это. Например, если у вас есть карта с именами на номера телефонов, вы можете позвонить ей phone_map итератор будет phone_map::iterator,

auto также полезный инструмент для идеальной пересылки

3

Другие решения

В C ++ 11 вы можете использовать decltype чтобы получить тип из переменной.

Написать:

std::unordered_map<keyclass, valueclass> m;
decltype(m)::iterator it = m.begin();

Конечно, если вы находитесь в C ++ 1, то вы также можете просто написать:

std::unordered_map<keyclass, valueclass> m;
auto it = m.begin();
2

По вопросам рекламы [email protected]