std::for_each
| 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) |
f dado al resultado de desreferenciar cada iterador en el rango [first, last), en orden.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.
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:
La signatura no necesita tener |
| 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.
| ||
Valor de retorno
f (hasta C++11) std::move(f) (desde C++11) Complejidad
Exactamente last - first aplicaciones de f.
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.
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
}
|
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
Véase también
| Aplica una función a un rango de elementos (plantilla de función) | |
(C++17) |
Aplica un objeto función a los primeros n elementos de una secuencia. (plantilla de función) |
(C++20) |
Aplica una función a un rango de elementos. (niebloid) |
(C++20) |
Aplica un objeto función a los primeros n elementos de una secuencia. (niebloid) |
Bucle for basado en rango
|
Ejecuta un bucle sobre un rango (desde C++11) |