Translate

miércoles, 3 de diciembre de 2025

for basado en rango vs std::for_each en C++


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.