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:
- Elementos no modificables: Sin una referencia explícita, no puedes modificar los elementos del contenedor.
- 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.
- 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.