Namespaces
Variants

std::ranges:: generate_n

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
Definido en el encabezado <algorithm>
Firma de llamada
template < std:: input_or_output_iterator O, std:: copy_constructible F >

requiere 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 sucesivas invocaciones 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 algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

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)