Namespaces
Variants

std::for_each_n

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutació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.

1) f se aplica en orden comenzando desde first.
Si UnaryFunc no es MoveConstructible, el comportamiento es indefinido.
2) f podría no aplicarse en orden. El algoritmo se ejecuta de acuerdo con policy.
A diferencia de otros algoritmos paralelos, for_each_n no está permitido hacer copias arbitrarias de elementos del rango objetivo.
Esta sobrecarga participa en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

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)
Si 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:

void fun(const Type &a);

La firma no necesita tener const &.
El tipo Type debe ser tal que un objeto de tipo InputIt pueda ser desreferenciado y luego convertido implícitamente a Type.

​

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

2) Durante el proceso de ejecución:
  • 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

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)
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)
rango-for bucle(C++11) ejecuta bucle sobre rango