Поделиться через


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

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

for ( for-range-declaration : expression ) 
   statement

Заметки

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

В следующем примере показано, как использовать циклы 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 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): break, return или goto (переход к оператору с меткой, находящемуся за пределами цикла for, основанного на диапазоне). Оператор continue в for, основанном на диапазоне, завершает только текущую итерацию.

При работе с циклами for, основанными на диапазонах, рекомендуется учитывать следующие факты.

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

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

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

См. также

Ссылки

Ключевое слово auto (выведение типа)

Операторы перебора (C++)

Ключевые слова в C++

Оператор while (C++)

Выражение do-while (C++)

Оператор for (C++)