Espacios de nombres
Variantes
Acciones

std::for_each

De cppreference.com
< cpp‎ | algorithm
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
for_each
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
(C++11)
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
Definido en el archivo de encabezado <algorithm>
(1)
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
(hasta C++20)
template< class InputIt, class UnaryFunction >
constexpr UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
(desde C++20)
template< class ExecutionPolicy, class ForwardIt, class UnaryFunction2 >
void for_each( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryFunction2 f );
(2) (desde C++17)
1) Aplica el objeto función f dado al resultado de desreferenciar cada iterador en el rango [first, last), en orden.
2) Aplica el objeto función f dado al resultado de desreferenciar cada iterador en el rango [first, last) (no necesariamente en orden). El algoritmo se ejecuta de acuerdo a la política de ejecución policy. Esta sobrecarga no participa en la resolución de sobrecarga a menos que std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> (hasta C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> (desde C++20) sea verdadera.

Para ambas sobrecargas, si el tipo del iterador es mutable, f puede modificar los elementos del rango a través del iterador desreferenciado. Si f devuelve un resultado, el resultado se ignora.

A diferencia del resto de los algoritmos paralelos, no se permite que for_each haga copias de los elementos en la secuencia incluso si son trivialmente copiables.

Contenido

[editar] Parámetros

first, last - El rango al que aplicar la función.
policy - La política de ejecución a usar. Véase política de ejecución para más detalles.
f - Objeto función Objeto función aplicarse al resultado de desreferenciar cada iterador en el rango [first, last).

La signatura de la función deberá ser equivalente a lo siguiente:

 void fun(const Type &a);

La signatura no necesita tener const &.
El tipo Type debe ser tal que un objeto del tipo InputIt puede ser desreferenciado y entonces convertido implícitamente a Type.

Requisitos de tipo
-
InputIt debe satisfacer los requisitos de InputIterator.
-
ForwardIt debe satisfacer los requisitos de ForwardIterator.
-
UnaryFunction debe satisfacer los requisitos de MoveConstructible. No tiene que ser CopyConstructible
-
UnaryFunction2 debe satisfacer los requisitos de CopyConstructible.

[editar] Valor de retorno

1) f (hasta C++11) std::move(f) (desde C++11)
2) (Ninguno).

[editar] Complejidad

Exactamente last - first aplicaciones de f.

[editar] Excepciones

La sobrecarga con un parámetro de plantilla llamado ExecutionPolicy (política de ejecución) reporta errores tales que:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y la política de ejecución es una de las tres políticas estándar, se llama a std::terminate. Para cualquier otra política de ejecución, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

[editar] Posible implementación

Véanse también las implementaciones en libstdc++, libc++ and MSVC stdlib.

template<class InputIt, class UnaryFunction>
constexpr UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
    for (; first != last; ++first) {
        f(*first);
    }
    return f; // movimiento implícito desde C++11
}

[editar] Ejemplo

El ejemplo siguiente utiliza una función lambda para incrementar todos los elementos de un vector y después usa un operador operator() sobrecargado en un objeto función para calcular una suma de ellos. Observa que para calcular la suma, se recomienda usar el algoritmo dedicado std::accumulate.

#include <vector>
#include <algorithm>
#include <iostream>
 
struct Suma
{
    void operator()(int n) { suma += n; }
    int suma{0};
};
 
int main()
{
    std::vector<int> nums{3, 4, 2, 8, 15, 267};
 
    auto imprimir = [](const int& n) { std::cout << " " << n; };
 
    std::cout << "antes:";
    std::for_each(nums.cbegin(), nums.cend(), imprimir);
    std::cout << '\n';
 
    std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });
 
    // llama a Suma::operator() para cada miembro
    Suma s = std::for_each(nums.begin(), nums.end(), Suma());
 
    std::cout << "después: ";
    std::for_each(nums.cbegin(), nums.cend(), imprimir);
    std::cout << '\n';
    std::cout << "suma: " << s.suma << '\n';
}

Salida:

antes: 3 4 2 8 15 267
después:  4 5 3 9 16 268
suma: 305

[editar] Véase también

Aplica una función a un rango de elementos
(plantilla de función) [editar]
Aplica un objeto función a los primeros n elementos de una secuencia.
(plantilla de función) [editar]
Aplica una función a un rango de elementos.
(niebloid) [editar]
Aplica un objeto función a los primeros n elementos de una secuencia.
(niebloid) [editar]
Bucle for basado en rango Ejecuta un bucle sobre un rango (desde C++11) [editar]