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.
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 &. |
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
f
(hasta C++11) std::move(f) (desde C++11) [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) | |
(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) |