Namespaces
Variants

std::ranges:: generate

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:: sentinel_for < O > S,

std:: copy_constructible F >
requires std:: invocable < F & > && std:: indirectly_writable < O, std:: invoke_result_t < F & >>
constexpr O

generate ( O first, S last, F gen ) ;
(1) (desde C++20)
template < class R, std:: copy_constructible F >

requires std:: invocable < F & > && ranges:: output_range < R, std:: invoke_result_t < F & >>
constexpr ranges:: borrowed_iterator_t < R >

generate ( R && r, F gen ) ;
(2) (desde C++20)
1) Asigna el resultado de sucesivas invocaciones del objeto función gen a cada elemento en el rango [ first , last ) .
2) Igual que (1) , pero utiliza r como el rango, como si se usara ranges:: begin ( r ) como first y ranges:: end ( r ) como last .

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

first, last - el par iterador-centinela que define el rango de elementos a modificar
r - el rango de elementos a modificar
gen - el objeto función generador

Valor de retorno

Un iterador de salida que se compara igual a last .

Complejidad

Exactamente ranges:: distance ( first, last ) invocaciones de gen ( ) y asignaciones.

Implementación posible

struct generate_fn
{
    template<std::input_or_output_iterator O, std::sentinel_for<O> S,
             std::copy_constructible F>
    requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
    constexpr O operator()(O first, S last, F gen) const
    {
        for (; first != last; *first = std::invoke(gen), ++first)
        {}
        return first;
    }
    template<class R, std::copy_constructible F>
    requires std::invocable<F&> && ranges::output_range<R, std::invoke_result_t<F&>>
    constexpr ranges::borrowed_iterator_t<R> operator()(R&& r, F gen) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(gen));
    }
};
inline constexpr generate_fn generate {};

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 device;
    static std::mt19937 engine {device()};
    return distr(engine);
}
void iota(auto& r, int init)
{
    std::ranges::generate(r, [init] mutable { return init++; });
}
void print(std::string_view comment, const auto& v)
{
    for (std::cout << comment; int i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}
int main()
{
    std::array<int, 8> v;
    std::ranges::generate(v.begin(), v.end(), dice);
    print("dice: ", v);
    std::ranges::generate(v, dice);
    print("dice: ", v);
    iota(v, 1);
    print("iota: ", v);
}

Salida posible:

dice: 4 3 1 6 6 4 5 5
dice: 4 2 5 3 6 2 6 2
iota: 1 2 3 4 5 6 7 8

Véase también

guarda el resultado de N aplicaciones de una función
(objeto función de algoritmo)
asigna a un rango de elementos un valor determinado
(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)
llena un rango con números aleatorios de un generador uniforme de bits aleatorios
(objeto función de algoritmo)
asigna los resultados de llamadas sucesivas de función a cada elemento en un rango
(plantilla de función)