std:: for_each_n
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
InputIt,
class
Size,
class
UnaryFunc
>
InputIt for_each_n ( InputIt first, Size n, UnaryFunc f ) ; |
(1) |
(desde C++17)
(constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
Size,
class
UnaryFunc
>
|
(2) | (desde C++17) |
Aplica el objeto de función dado
f
al resultado de desreferenciar cada iterador en el rango
[
first
,
first
+
n
)
. Si
f
devuelve un resultado, este se ignora.
|
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 n >= 0 no es true , el comportamiento es indefinido.
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_n
no está permitido hacer copias de los elementos en la secuencia incluso si son
TriviallyCopyable
.
Contenidos |
Parámetros
| first | - | el inicio del rango al que aplicar la función |
| n | - | el número de elementos al que aplicar la función |
| policy | - | la política de ejecución a utilizar |
| f | - |
objeto función, a aplicar al resultado de desreferenciar cada iterador en el rango
[
first
,
first
+
n
)
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
.
|
||
-
Size
debe ser convertible a un tipo integral.
|
||
Valor de retorno
Un iterador igual a first + n , o más formalmente, a std:: advance ( first, n ) .
Complejidad
Exactamente n 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 la implementación en libstdc++ , libc++ y MSVC stdlib .
template<class InputIt, class Size, class UnaryFunc> InputIt for_each_n(InputIt first, Size n, UnaryFunc f) { for (Size i = 0; i < n; ++first, (void) ++i) f(*first); return first; } |
Ejemplo
#include <algorithm> #include <iostream> #include <vector> void println(auto const& v) { for (auto count{v.size()}; const auto& e : v) std::cout << e << (--count ? ", " : "\n"); } int main() { std::vector<int> vi{1, 2, 3, 4, 5}; println(vi); std::for_each_n(vi.begin(), 3, [](auto& n) { n *= 2; }); println(vi); }
Salida:
1, 2, 3, 4, 5 2, 4, 6, 4, 5
Véase también
|
aplica una función a un rango de elementos, almacenando los resultados en un rango destino
(plantilla de función) |
|
bucle
for
de rango
(C++11)
|
ejecuta un bucle sobre un rango |
|
aplica un
objeto función
unario a elementos de un
rango
(plantilla de función) |
|
|
(C++20)
|
aplica un objeto función a los primeros N elementos de una secuencia
(objeto función de algoritmo) |