Desde C++11, C++ ofrece dos formas elegantes de recorrer contenedores:
el bucle for basado en rango y el algoritmo std::for_each de la STL (Standard Template Library).
Aunque ambos hacen lo mismo, hay diferencias importantes en estilo, expresividad y flexibilidad.
for basado en rango
La forma más simple y legible para recorrer elementos:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numeros = {1, 2, 3, 4, 5};
for (int n : numeros)
std::cout << n << " ";
}
Ventajas:
- Sintaxis clara y directa.
- Ideal para recorrer contenedores completos.
- Soporta modificación con referencias (int& n).
Desventajas:
- No se puede interrumpir fácilmente ni combinar con otros algoritmos STL.
- No retorna nada.
std::for_each
std::for_each pertenece al encabezado <algorithm> y aplica una función o lambda a cada elemento del rango.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numeros = {1, 2, 3, 4, 5};
std::for_each(numeros.begin(), numeros.end(),
[](int n) { std::cout << n << " "; });
}
Ventajas:
- Permite integrar lambdas o funciones personalizadas.
- Compatible con pipelines de algoritmos STL.
- Puede retornar un iterador al final del rango.
Desventajas:
- Sintaxis más verbosa.
- Menos legible para tareas simples.
Ambos pueden modificar los elementos si se usan referencias:
// Con for basado en rango
for (int& n : numeros)
n *= 2;
// Con std::for_each
std::for_each(numeros.begin(), numeros.end(),
[](int& n) { n *= 2; });
En Resumen:
- for basado en rango: simple, claro y moderno.
- std::for_each: más flexible, ideal cuando querés combinarlo con otros algoritmos STL.
Ambos son válidos y conviven perfectamente en el C++ moderno.
