Instrucción for basada en intervalo (C++)

Ejecuta statement de forma repetida y secuencial para cada elemento de expression.

Sintaxis

for (for-range-declaration:expression)
instrucción

Comentarios

Use la instrucción for basada en intervalo para construir los bucles que deben ejecutarse en un intervalo, que se define como cualquier elemento que se puede recorrer en iteración; por ejemplo, std::vector o cualquier otra secuencia de la biblioteca estándar de C++ cuyo intervalo esté definido por begin() y end(). El nombre que se declara en la parte for-range-declaration es local de la instrucción for y no se puede volver a declarar en expression o statement. Tenga en cuenta que es preferible usar la palabra clave auto en la parte for-range-declaration de la instrucción.

Novedades de Visual Studio 2017: los bucles for basados en intervalos ya no necesitan que begin() ni end() devuelvan objetos del mismo tipo. Esto permite que end() devuelva un objeto centinela como el que usan los intervalos tal como se define en la propuesta de intervalos V3. Para obtener más información, consulte Generalización del bucle For basado en intervalo y la Biblioteca range-v3 en GitHub.

En este código se muestra cómo usar bucles for basados en intervalos para iterar por una matriz y un vector:

// 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;
}

Aquí está la salida:

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

Un bucle for basado en intervalo finaliza cuando se ejecuta uno de estos elementos en statement: break, return o goto a una instrucción con etiqueta fuera del bucle for basado en intervalo. Una instrucción continue en un bucle for basado en intervalo solo finaliza la iteración actual.

Tenga en cuenta lo siguiente sobre la instrucción for basada en intervalo:

  • Reconoce automáticamente las matrices.

  • Reconoce los contenedores que tienen .begin() y .end().

  • Utiliza la búsqueda dependiente de argumentos begin() y end() para todo lo demás.

Consulte también

auto
Instrucciones de iteración
Palabras clave
Instrucción while (C++)
Instrucción do-while (C++)
Instrucción for (C++)