Основанное на диапазоне выражение for (C++)

Циклически и последовательно выполняет оператор (statement) каждого элемента в выражении (expression).

Синтаксис

for (for-range-declaration:Выражение)
инструкция

Комментарии

Используйте оператор на основе for диапазона для создания циклов, которые должны выполняться через диапазон, который определяется как любой, через который можно выполнить итерацию( например, std::vectorили любую другую последовательность стандартной библиотеки C++, диапазон которой определяется begin() и end(). Имя, объявленное в for-range-declaration части, является локальным для инструкции for и не может быть повторно объявлено в expression или statement. Обратите внимание, что ключевое auto слово предпочтительно в for-range-declaration части инструкции.

Новые возможности в Visual Studio 2017: циклы на основе for диапазона больше не требуют этого begin() и end() возвращают объекты одного типа. Это позволяет end() возвращать объект sentinel, например используемый диапазонами, как определено в предложении Ranges-V3. Дополнительные сведения см. в разделе "Обобщение Range-Based LoopFor" и библиотеки range-v3 в GitHub.

В этом коде показано, как использовать циклы на основе for диапазона для итерации по массиву и вектору:

// range-based-for.cpp
// compile by using: cl /EHsc /nologo /W4
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    // Basic 10-element integer array.
    int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    // Range-based for loop to iterate through the array.
    for( int y : x ) { // Access by value using a copy declared as a specific type.
                       // Not preferred.
        cout << y << " ";
    }
    cout << endl;

    // The auto keyword causes type inference to be used. Preferred.

    for( auto y : x ) { // Copy of 'x', almost always undesirable
        cout << y << " ";
    }
    cout << endl;

    for( auto &y : x ) { // Type inference by reference.
        // Observes and/or modifies in-place. Preferred when modify is needed.
        cout << y << " ";
    }
    cout << endl;

    for( const auto &y : x ) { // Type inference by const reference.
        // Observes in-place. Preferred when no modify is needed.
        cout << y << " ";
    }
    cout << endl;
    cout << "end of integer array test" << endl;
    cout << endl;

    // Create a vector object that contains 10 elements.
    vector<double> v;
    for (int i = 0; i < 10; ++i) {
        v.push_back(i + 0.14159);
    }

    // Range-based for loop to iterate through the vector, observing in-place.
    for( const auto &j : v ) {
        cout << j << " ";
    }
    cout << endl;
    cout << "end of vector test" << endl;
}

Результат выглядит так:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
end of integer array test

0.14159 1.14159 2.14159 3.14159 4.14159 5.14159 6.14159 7.14159 8.14159 9.14159
end of vector test

Цикл на основе for диапазона завершается, когда выполняется один из них statement : a break, returnили goto к помеченной инструкции за пределами цикла на основе for диапазона. Оператор continue в цикле на основе for диапазона завершает только текущую итерацию.

Имейте в виду следующие факты о диапазоне:for

  • Такие циклы автоматически распознают массивы.

  • Такие циклы автоматически распознают контейнеры с методами .begin() и .end().

  • Для всех остальных итераторов в них используются поиск, зависящий от аргументов (begin() и end()).

См. также раздел

auto
Операторы итерации
Ключевые слова
Оператор while (C++)
Оператор do-while (C++)
Оператор for (C++)