Translate

miércoles, 4 de diciembre de 2024

C++ : range-based for loop (o foreach para los amigos)


C++ 11 ofrece una forma más sencilla y legible de iterar sobre los elementos de un contenedor, como un vector, list o set. Se introdujo en C++11 con el nombre de "range-based for loop" (pero yo le voy a llamar foreach) y ha ganado popularidad por su simplicidad y expresividad.

La estructura básica es:


for (declaración : contenedor) {

    // cuerpo del ciclo

}

  • declaración: Representa cada elemento del contenedor.
  • contenedor: Es una estructura iterable, como std::vector, std::list, o incluso un arreglo C++.


Imaginemos un vector de enteros. Con foreach, iteramos de esta forma:


#include <iostream>

#include <vector>


int main() {

    std::vector<int> numeros = {1, 2, 3, 4, 5};


    for (int numero : numeros) {

        std::cout << numero << " ";

    }

    return 0;

}


Salida: 1 2 3 4 5


Si deseas modificar los elementos dentro del bucle, usa una referencia (`&`):



#include <iostream>

#include <vector>


int main() {

    std::vector<int> numeros = {1, 2, 3, 4, 5};


    for (int& numero : numeros) {

        numero *= 2; // Duplicar cada valor

    }


    for (int numero : numeros) {

        std::cout << numero << " ";

    }

    return 0;

}



Salida: 2 4 6 8 10


En un std::map, cada elemento es un par clave-valor (std::pair). Puedes acceder a ellos directamente:


#include <iostream>

#include <map>


int main() {

    std::map<std::string, int> edades = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};


    for (const auto& [nombre, edad] : edades) {

        std::cout << nombre << ": " << edad << "\n";

    }

    return 0;

}

Salida:

Alice: 30

Bob: 25

Charlie: 35


Como limitaciones tenemos:

  1. Elementos no modificables: Sin una referencia explícita, no puedes modificar los elementos del contenedor.
  2. No apto para todos los contenedores: Aunque funciona con la mayoría de las estructuras estándar, asegúrate de que el contenedor sea compatible con iteradores.
  3. Iteración sobre arreglos estáticos: También es compatible con arreglos tradicionales:


   int numeros[] = {1, 2, 3, 4};

   for (int numero : numeros) {

       std::cout << numero << " ";

   }


El foreach en C++ simplifica la iteración y mejora la legibilidad del código.