Namespaces
Variants

std::ranges::generate_n

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, por ejemplo, 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)

Operaciones de ordenación y relacionadas
Operaciones de particionamiento
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (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


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombres std::ranges
Operaciones de secuencia no modificadoras
Operaciones de modificación de secuencia
Operaciones de particionamiento
Operaciones de ordenación
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones sobre almacenamiento no inicializado
Tipos de retorno
 
Definido en el encabezado <algorithm>
Firma de llamada
template< std::input_or_output_iterator O, std::copy_constructible F >
requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
constexpr O
    generate_n( O first, std::iter_difference_t<O> n, F gen );
(desde C++20)

Asigna el resultado de invocaciones sucesivas del objeto función gen a cada elemento en el rango [first, first + n), si 0 < n. No hace nada en caso contrario.

Las entidades similares a funciones descritas en esta página son objetos función de algoritmo (conocidos informalmente como niebloids), es decir:

Parámetros

first - el inicio del rango de elementos a modificar
n - número de elementos a modificar
gen - el objeto función generador.

Valor de retorno

Iterador al elemento siguiente al último asignado si 0 < count , first en caso contrario.

Complejidad

Exactamente n invocaciones de gen ( ) y asignaciones.

Implementación posible

struct generate_n_fn
{
    template<std::input_or_output_iterator O, std::copy_constructible F>
    requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
    constexpr O operator()(O first, std::iter_difference_t<O> n, F gen) const
    {
        for (; n-- > 0; *first = std::invoke(gen), ++first)
        {}
        return first;
    }
};
inline constexpr generate_n_fn generate_n {};

Ejemplo

#include <algorithm>
#include <array>
#include <iostream>
#include <random>
#include <string_view>
auto dice()
{
    static std::uniform_int_distribution<int> distr {1, 6};
    static std::random_device engine;
    static std::mt19937 noise {engine()};
    return distr(noise);
}
void print(const auto& v, std::string_view comment)
{
    for (int i : v)
        std::cout << i << ' ';
    std::cout << '(' << comment << ")\n";
}
int main()
{
    std::array<int, 8> v;
    std::ranges::generate_n(v.begin(), v.size(), dice);
    print(v, "dice");
    std::ranges::generate_n(v.begin(), v.size(), [n {0}] mutable { return n++; });
    // mismo efecto que std::iota(v.begin(), v.end(), 0);
    print(v, "iota");
}

Salida posible:

5 5 2 2 6 6 3 5 (dice)
0 1 2 3 4 5 6 7 (iota)

Véase también

guarda el resultado de una función en un rango
(objeto función de algoritmo)
llena un rango con números aleatorios de un generador uniforme de bits aleatorios
(objeto función de algoritmo)
asigna un valor determinado a un rango de elementos
(objeto función de algoritmo)
asigna un valor a una cantidad de elementos
(objeto función de algoritmo)
aplica una función a un rango de elementos
(objeto función de algoritmo)
asigna los resultados de llamadas sucesivas de función a N elementos en un rango
(plantilla de función)