[C++11] Instrucciones para usar el bucle for basado en rango

1. Definición:

C++ 11 introduce forel bucle for basado en rango, que es un azúcar sintáctico que facilita el recorrido de contenedores u otros objetos iterables .

La sintaxis de un bucle basado en rango fores la siguiente:

for (declaration : range) 
{
    
    
    // 循环体
}

Entre ellos, declarationse encuentra una declaración de variable que se utiliza para almacenar el valor del elemento en cada iteración. Puede ser un nombre de variable personalizado o un nombre de variable existente. range¿Es el contenedor o el objeto iterable que se va a atravesar, como una matriz, std::vectoretc. std::list?

En cada iteración del bucle, a la variable declarationse le asignará automáticamente el valor del elemento de la iteración actual y luego se ejecutará el código en el cuerpo del bucle. El bucle recorrerá rangetodos los elementos hasta que se agote.

2. Uso:

Ejemplo 1: atravesar std::vectorcontenedores

#include <iostream>
#include <vector>

int main() 
{
    
    
    std::vector<int> numbers = {
    
    1, 2, 3, 4, 5};

    //使用基于范围的for循环遍历容器
    for (int num : numbers)    //可以使用auto自动类型推导
    {
    
    
        std::cout << num << " ";
    }
    
    std::cout << std::endl;
    return 0;
}
//result
1 2 3 4 5

Cuando el compilador encuentra un bucle basado en rango for, lo convierte automáticamente en un bucle de iteración tradicional que itera sobre los elementos en el rango especificado.

Los bucles basados ​​en rangos se pueden utilizar en una variedad de objetos foriterables, incluidas matrices, clases de contenedores (como std::vector, etc.), cadenas y tipos iterables personalizados.std::liststd::deque

Durante el ciclo, cada iteración obtendrá el siguiente elemento del rango especificado y lo asignará a la variable del ciclo. Esto permite que la variable del bucle se use directamente dentro del cuerpo del bucle para operar en el elemento actual sin acceso explícito al iterador o índice.

Ejemplo 2: si desea modificar los elementos en el contenedor, debe utilizar referencias

#include <iostream>
#include <vector>

int main()
{
    
    
	std::vector<int> numbers = {
    
     1, 2, 3, 4, 5 };

	//使用基于范围的for循环遍历容器 - 使用引用修改元素
	for (auto& num : numbers)
	{
    
    
		num = num + 1;
	}

    //若无需修改容器中的元素,可以使用const限制
	for (const auto& num : numbers) 
	{
    
    
		std::cout << num << " ";
	}

	std::cout << std::endl;
	return 0;
}
//result
2 3 4 5 6

Se puede ver que el forbucle basado en rango hace que recorrer el contenedor sea más conciso e intuitivo: no es necesario prestar atención al tamaño y al índice del contenedor, solo al valor del elemento en cada iteración. Esta sintaxis mejora la legibilidad y la simplicidad del código en muchos escenarios.

Ejemplo 3: uso de bucles basados ​​en rangos forpara iterar sobre un contenedor de tipo personalizado

#include <iostream>
#include <vector>

class Point 
{
    
    
public:
    int x, y;

    Point(int x_, int y_) : x(x_), y(y_) {
    
    }
};

int main() 
{
    
    
    std::vector<Point> points = {
    
    {
    
    1, 2}, {
    
    3, 4}, {
    
    5, 6}};

    // 使用基于范围的for循环遍历容器
    for(const auto& point : points) 
    {
    
    
        std::cout << "x: " << point.x << ", y: " << point.y << std::endl;
    }

    return 0;
}
//result
x: 1, y: 2
x: 3, y: 4
x: 5, y: 6

En el bucle del código anterior, cada pointobjeto es un elemento en el contenedor y se puede acceder a sus variables miembro a través de point.xy . point.yEl bucle basado en rango forhace que atravesar los elementos del contenedor sea conciso y claro, y es más propicio para el mantenimiento del código.

3. Ventajas:

Las ventajas de los bucles basados ​​en rango forson las siguientes:

  1. No es necesario definir explícitamente iteradores o variables de índice.
  2. Maneje automáticamente los límites de los contenedores para evitar el acceso fuera de los límites.
  3. Admite acceso de solo lectura a elementos y no puede modificar los valores de los elementos en el contenedor.
  4. El ciclo de vida de una variable de bucle se limita a la iteración del bucle actual y ya no es válido una vez que finaliza el bucle.
  5. El tipo de variable de bucle puede ser un tipo personalizado, siempre que el objeto admita el método de acceso del iterador.

Si este artículo te resulta útil, ¡me gustaría recibir un Me gusta tuyo!

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/AAADiao/article/details/131082505
Recomendado
Clasificación