std::generate_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) |
g, a los primeros count elementos del rango que comienza en first, si count > 0. En caso contrario no hace nada.policy.true:
|
|
(hasta C++20) |
|
|
(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:
El tipo | ||||||
| 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
ExecutionPolicyes una de las políticas estándar, se llama a std::terminate. Para cualquier otroExecutionPolicy, 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 invocacioneso 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) | |
(C++20) |
|
| asigna los resultados de llamadas sucesivas a una función a cada elemento en un rango (plantilla de función & objeto función algoritmo) | |
(C++20) |
|
(C++20) |
guarda el resultado de N aplicaciones de una función (objeto función algoritmo) |