std:: for_each
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
InputIt,
class
UnaryFunc
>
UnaryFunc for_each ( InputIt first, InputIt last, UnaryFunc f ) ; |
(1) | (constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
UnaryFunc
>
void
for_each
(
ExecutionPolicy
&&
policy,
|
(2) | (desde C++17) |
Aplica el objeto de función unario dado
function object
f
al resultado de desreferenciar cada
iterator
en el
range
[
first
,
last
)
. Si
f
retorna un resultado, el resultado es ignorado.
|
Si
|
(since C++11) |
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true . |
(hasta C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true . |
(desde C++20) |
Si el tipo de iterador (
InputIt
/
ForwardIt
) es mutable,
f
puede modificar los elementos del
rango
a través del iterador desreferenciado.
A diferencia del resto de los algoritmos paralelos,
for_each
no está permitido hacer copias de los elementos en la secuencia incluso si son
TriviallyCopyable
.
Contenidos |
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos al cual se aplicará el objeto función |
| policy | - | la política de ejecución a utilizar |
| f | - |
objeto función, que se aplicará al resultado de desreferenciar cada iterador en el
rango
[
first
,
last
)
La firma de la función debe ser equivalente a la siguiente: void fun ( const Type & a ) ;
La firma no necesita tener
const
&
.
|
| Requisitos de tipo | ||
-
InputIt
debe cumplir con los requisitos de
LegacyInputIterator
.
|
||
-
ForwardIt
debe cumplir con los requisitos de
LegacyForwardIterator
.
|
||
Valor de retorno
Complejidad
Exactamente std:: distance ( first, last ) aplicaciones de f .
Excepciones
La sobrecarga con un parámetro de plantilla llamado
ExecutionPolicy
reporta errores de la siguiente manera:
-
Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.
Implementación posible
Consulte también las implementaciones en libstdc++ , libc++ y MSVC stdlib .
template<class InputIt, class UnaryFunc> constexpr UnaryFunc for_each(InputIt first, InputIt last, UnaryFunc f) { for (; first != last; ++first) f(*first); return f; // movimiento implícito desde C++11 } |
Notas
Para la sobrecarga ( 1 ) , f puede ser un objeto función con estado. El valor de retorno puede considerarse como el estado final de la operación por lotes.
Para la sobrecarga ( 2 ) , pueden crearse múltiples copias de f para realizar invocación paralela. No se devuelve ningún valor porque la paralelización frecuentemente no permite una acumulación eficiente de estado.
Ejemplo
El siguiente ejemplo utiliza una
lambda-expression
para incrementar todos los elementos de un vector y luego utiliza un
operator()
sobrecargado en un function object (también conocido como "functor") para calcular su suma. Nótese que para calcular la suma, se recomienda utilizar el algoritmo dedicado
std::accumulate
.
#include <algorithm> #include <iostream> #include <vector> int main() { std::vector<int> v{3, -4, 2, -8, 15, 267}; auto print = [](const int& n) { std::cout << n << ' '; }; std::cout << "before:\t"; std::for_each(v.cbegin(), v.cend(), print); std::cout << '\n'; // increment elements in-place std::for_each(v.begin(), v.end(), [](int &n) { n++; }); std::cout << "after:\t"; std::for_each(v.cbegin(), v.cend(), print); std::cout << '\n'; struct Sum { void operator()(int n) { sum += n; } int sum {0}; }; // invoke Sum::operator() for each element Sum s = std::for_each(v.cbegin(), v.cend(), Sum()); std::cout << "sum:\t" << s.sum << '\n'; }
Salida:
before: 3 -4 2 -8 15 267 after: 4 -3 3 -7 16 268 sum: 281
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 475 | C++98 |
no estaba claro si
f
puede modificar los elementos
de la secuencia que se está iterando (
for_each
se
clasifica como "operaciones de secuencia no modificadoras") |
se aclaró (permitido si el
tipo de iterador es mutable) |
| LWG 2747 | C++11 | la sobrecarga ( 1 ) devolvía std :: move ( f ) | devuelve f (que implícitamente mueve) |
Véase también
|
aplica una función a un rango de elementos, almacenando resultados en un rango destino
(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 un
objeto función
unario a elementos de un
rango
(objeto función algoritmo) |
|
(C++20)
|
aplica un objeto función a los primeros N elementos de una secuencia
(objeto función algoritmo) |
bucle
for
de rango
(C++11)
|
ejecuta bucle sobre rango |