Namespaces
Variants

std::generate_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 modificación de secuencia
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)

Ordenación y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de mezcla (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 OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g );
(1) (constexpr desde C++20)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class Generator >
ForwardIt generate_n( ExecutionPolicy&& policy,
                      ForwardIt first, Size count, Generator g );
(2) (desde C++17)
1) Asigna valores, generados por el objeto función dado g, a los primeros count elementos del rango que comienza en first, si count > 0. En caso contrario no hace nada.
2) Igual que (1), pero ejecutado según policy.
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 Size no es convertible a un tipo entero, el programa está mal formado.

Parámetros

first - el inicio del rango de elementos a generar
count - número de elementos a generar
policy - la política de ejecución a utilizar
g - objeto función generador que será invocado.

La firma de la función debe ser equivalente a la siguiente:

Ret fun();

El tipo Ret debe ser tal que un objeto de tipo OutputIt pueda ser desreferenciado y asignado con un valor de tipo Ret. ​

Requisitos de tipo
-
OutputIt debe cumplir los requisitos de LegacyOutputIterator.
-
ForwardIt debe cumplir los requisitos de LegacyForwardIterator.

Valor de retorno

Iterador al siguiente elemento después del último asignado si count > 0, first en caso contrario.

Complejidad

Exactamente std::max(0, count) invocaciones de g() y asignaciones.

Excepciones

La sobrecarga con un parámetro de plantilla llamado ExecutionPolicy informa errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es una de las políticas estándar, se llama a std::terminate. Para cualquier otro ExecutionPolicy, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

Posible implementación

template<class OutputIt, class Size, class Generator>
constexpr // since C++20
OutputIt generate_n(OutputIt first, Size count, Generator g)
{
    for (Size i = 0; i < count; ++i, ++first)
        *first = g();
    
    return first;
}

Ejemplo

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>

int main()
{
    std::mt19937 rng; // default constructed, seeded with fixed seed
    std::generate_n(std::ostream_iterator<std::mt19937::result_type>(std::cout, " "),
                    5, std::ref(rng));
    std::cout << '\n';
}

Salida:

3499211612 581869302 3890346734 3586334585 545404204

Informes de defectos

Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a los estándares C++ previamente publicados.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 426 C++98 el requisito de complejidad era "exactamente count invocaciones
o asignaciones", lo cual está roto si count es negativo
ninguna invocación o asignación
si count no es positivo
LWG 865 C++98 la ubicación del primer elemento siguiente al
rango de generación no se devolvía
se devuelve

Véase también

copia-asigna el valor dado a N elementos en un rango
(plantilla de función & objeto función algoritmo)
asigna los resultados de llamadas sucesivas a una función a cada elemento en un rango
(plantilla de función & objeto función algoritmo)
guarda el resultado de N aplicaciones de una función
(objeto función algoritmo)