Подтвердить что ты не робот

Итерация через структуру данных карты С++ 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';
    }  

Кроме того, мне любопытно узнать точные последствия использования ключевого слова "авто" здесь.

4b9b3361

Ответ 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';
}