Итерация через структуру данных карты С++ STL: новая методика? (Итерация по диапазону и ключевое слово 'auto')
До сих пор я всегда использовал итератор для перемещения по всем клавишам на карте STL следующим образом:
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it){
std::cout << it->first << " => " << it->second << '\n';
}
Совсем недавно, хотя я натолкнулся на какой-то код, который использовал другой стиль для итерации по клавишам, как показано ниже. Была ли эта функция добавлена только недавно в пересмотренный стандарт? Похоже, что это довольно интересный способ сделать больше с меньшим кодом, как уже многие другие языки.
for (auto& x: mymap) {
std::cout << x.first << " => " << x.second << '\n';
}
Кроме того, мне любопытно узнать точные последствия использования ключевого слова "авто" здесь.
Ответы
Ответ 1
Этот код использует 2 новые функции из последнего стандарта С++ (С++ 11) auto keyword, для ввода типа и диапазон, основанный на цикле.
Используя только auto
, это можно записать как (спасибо Ben)
for (auto it=mymap.begin(); it!=mymap.end(); ++it)
Использование только диапазона для этого можно записать как
for (std::pair<const char,int>& x: mymap) {
std::cout << x.first << " => " << x.second << '\n';
}
Оба из них выполняют ту же задачу, что и ваши две версии.
Ответ 2
Следующие работали для меня:
for (auto x: mymap) {
cout << x.first << endl;
}
Ответ 3
Мне любопытно узнать о точном значении использования ключевого слова "auto" здесь.
Он позволяет:
- Меньшая типизация для типичного повторяющегося кода
- Меньше шансов на ручные ошибки, потому что компилятор выводит точный тип итератора.
Ответ 4
Это новая функция С++ 11, она называется Range-Based for Loops
, которая выполняет итерацию по всем элементам заданного диапазона, массива или коллекции. Его то, что в других языках программирования будет называться циклом foreach. Общий синтаксис выглядит следующим образом:
for ( decl : coll ) {
statement
}
Авто: автоматическое вычитание типа с авто
С С++ 11 вы можете объявить переменную или объект без указания его конкретного типа, используя, например:
auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
Ответ 5
В дополнение к предыдущим ответам, С++ 17 добавил другой подход, используя структурированные привязки:
for (auto& [key, value]: mymap) {
std::cout << key << " => " << value << '\n';
}