Instrucción for basada en intervalo (C++)Range-based for Statement (C++)

Ejecuta statement de forma repetida y secuencial para cada elemento de expression.Executes statement repeatedly and sequentially for each element in expression.

SintaxisSyntax

for ( for-range-declaration : expression )
   statement

ObservacionesRemarks

Use la instrucción for basada en intervalo para construir bucles que se deben ejecutar a través de un "intervalo", que se define como todo lo que se puede recorrer en iteración; por ejemplo C++ , std::vectoro cualquier otra secuencia de la biblioteca estándar cuyo intervalo esté definido por un begin() y end().Use the range-based for statement to construct loops that must execute through a "range", which is defined as anything that you can iterate through—for example, std::vector, or any other C++ Standard Library sequence whose range is defined by a begin() and end(). El nombre que se declara en la parte for-range-declaration es local para la instrucción for y no se puede volver a declarar en expression o statement.The name that is declared in the for-range-declaration portion is local to the for statement and cannot be re-declared in expression or statement. Tenga en cuenta que se prefiere la palabra clave auto en la parte for-range-declaration de la instrucción.Note that the auto keyword is preferred in the for-range-declaration portion of the statement.

Novedades de Visual Studio 2017: Los bucles for basados en intervalos ya no requieren que Begin () y end () devuelvan objetos del mismo tipo.New in Visual Studio 2017: Range-based for loops no longer require that begin() and end() return objects of the same type. Esto permite que end() devuelva un objeto centinela como el usado por los intervalos tal como se define en la propuesta de intervalos V3.This enables end() to return a sentinel object such as used by ranges as defined in the Ranges-V3 proposal. Para más información, vea Generalizing the Range-Based For Loop (Generalización del bucle for basado en intervalos) y range-v3 library (Biblioteca range-v3) en GitHub.For more information, see Generalizing the Range-Based For Loop and the range-v3 library on GitHub.

Este código muestra cómo usar bucles for basados en intervalos para recorrer en iteración una matriz y un vector:This code shows how to use range-based for loops to iterate through an array and a 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;
}

Este es el resultado:Here is the output:

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 en statement: break, Returno goto a una instrucción con etiqueta fuera del bucle for basado en intervalo.A range-based for loop terminates when one of these in statement is executed: a break, return, or goto to a labeled statement outside the range-based for loop. Una instrucción continue en un bucle for basado en intervalo finaliza solo la iteración actual.A continue statement in a range-based for loop terminates only the current iteration.

Tenga en cuenta que estos datos están basados en intervalos para:Keep in mind these facts about range-based for:

  • Reconoce automáticamente las matrices.Automatically recognizes arrays.

  • Reconoce los contenedores que tienen .begin() y .end().Recognizes containers that have .begin() and .end().

  • Utiliza la búsqueda dependiente de argumentos begin() y end() para todo lo demás.Uses argument-dependent lookup begin() and end() for anything else.

Consulte tambiénSee also

autoauto
Instrucciones de iteraciónIteration Statements
Palabras claveKeywords
while (Instrucción) (C++)while Statement (C++)
do-while (Instrucción) (C++)do-while Statement (C++)
for (Instrucción) (C++)for Statement (C++)