Есть ли более эффективный способ ссылки на имя типа итератора контейнера, чем ввод
std::unordered_map<keyclass, valueclass>::iterator
каждый раз, когда мне нужен итератор?
Есть конечно
typedef boost::unordered_map<keyclass, valueclass>::iterator classitr
но введение typedef для каждого контейнера не кажется мне очень читабельным кодом.
Будучи новичком в C ++ и предполагая, что каждый обычно имеет ссылку на контейнер, который он хочет использовать — есть ли что-то вроде
Container<KeyClass, ValueClass> x;
x::iterator_type i
или любой другой очевидный ярлык, который мне не хватает?
Это одна из причин, почему 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
также полезный инструмент для идеальной пересылки
В 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();