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

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

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 обычным подходом было использование typedefS, как вы предложили. Часто это может быть наиболее полезным для typedef контейнер, а затем дать все относительно этого:

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

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

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

В 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();
Другие вопросы по тегам