std::for_each_n
| Definido en el encabezado <algorithm>
|
||
template< class InputIt, class Size, class UnaryFunc >
InputIt for_each_n( InputIt first, Size count, UnaryFunc f );
|
(1) | (constexpr desde C++20) |
template< class ExecutionPolicy,
class ForwardIt, class Size, class UnaryFunc >
ForwardIt for_each_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, UnaryFunc f );
|
(2) | (desde C++17) |
Aplica el objeto invocable dado f a cada elemento en el rango objetivo [first, std::next(first, count)). Si f devuelve un resultado, el resultado se ignora.
f se aplica en orden comenzando desde first.UnaryFunc no es MoveConstructible, el comportamiento es indefinido.f podría no aplicarse en orden. El algoritmo se ejecuta de acuerdo con policy.for_each_n no está permitido hacer copias arbitrarias de elementos del rango objetivo.true:
|
|
(hasta C++20) |
|
|
(desde C++20) |
UnaryFunc no es CopyConstructible, el comportamiento es indefinido.Si count >= 0 no es true, el comportamiento es indefinido.
Parámetros
| first | - | el inicio del rango objetivo |
| count | - | el número de elementos en el rango objetivo |
| f | - | objeto función, que se aplicará a los elementos La firma de la función debe ser equivalente a la siguiente:
La firma no necesita tener |
| policy | - | la política de ejecución a usar |
| Requisitos de tipo | ||
-
InputIt debe cumplir los requisitos de LegacyInputIterator.
| ||
-
ForwardIt debe cumplir los requisitos de LegacyForwardIterator.
| ||
-
Size debe ser convertible a un tipo integral.
| ||
Valor de retorno
std::next(first, count)
Complejidad
Exactamente count aplicaciones de f.
Excepciones
- Si los recursos de memoria temporales requeridos para la paralelización no están disponibles, std::bad_alloc es lanzada.
- Si se lanza una excepción no capturada al acceder a objetos a través de un argumento del algoritmo, el comportamiento está determinado por la política de ejecución (para políticas estándar, std::terminate es invocado).
Notas
Si el tipo de iterador (InputIt/ForwardIt) es mutable, f puede modificar los elementos en el rango objetivo.
Posible implementación
Véase 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 count, UnaryFunc f)
{
for (Size i = 0; i < count; ++first, (void) ++i)
f(*first);
return first;
}
|
Ejemplo
#include <algorithm>
#include <iostream>
#include <vector>
void println(const auto& 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
Informes de defectos
Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3213 (P1718R2) |
C++17 | Size no se requería que fuera convertible a un tipo integral
|
requerido |
Véase también
(C++20) |
aplica un objeto función a los primeros N elementos de una secuencia (objeto función de algoritmo) |
| aplica una objeto función a elementos de un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| aplica una función a un rango de elementos, almacenando resultados en un rango de destino (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
rango-for bucle(C++11)
|
ejecuta bucle sobre rango |