Namespaces
Variants

std::generate

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 secuencia modificadoras
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
(until C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(sobre rangos particionados)
Operaciones de conjunto (sobre rangos ordenados)
Operaciones de fusión (sobre 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 ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );
(1) (constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt, class Generator >
void generate( ExecutionPolicy&& policy,
               ForwardIt first, ForwardIt last, Generator g );
(2) (desde C++17)
1) Asigna a cada elemento en el rango [first, last) un valor generado por el objeto función dado g.
2) Igual que (1), pero se ejecuta de acuerdo con 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)

Parámetros

first, last - el par de iteradores que define el rango de elementos a generar
policy - la política de ejecución a usar
g - objeto función generador que se llamará.

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 ForwardIt pueda ser desreferenciado y asignado un valor de tipo Ret. ​

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

Complejidad

Exactamente std::distance(first, last) invocaciones de g() y asignaciones.

Excepciones

La sobrecarga con un parámetro de plantilla llamado ExecutionPolicy reporta 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, std::terminate es llamada. Para cualquier otra ExecutionPolicy, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzada.

Posible implementación

template<class ForwardIt, class Generator>
constexpr //< since C++20
void generate(ForwardIt first, ForwardIt last, Generator g)
{
    for (; first != last; ++first)
        *first = g();
}

Ejemplo

#include <algorithm>
#include <iostream>
#include <vector>

void println(std::string_view fmt, const auto& v)
{
    for (std::cout << fmt; const auto& e : v)
        std::cout << e << ' ';
    std::cout << '\n';
};


int f()
{
    static int i;
    return ++i;
}

int main()
{
    std::vector<int> v(5);
    
    std::generate(v.begin(), v.end(), f);
    println("v: ", v);
    
    // Initialize with default values 0,1,2,3,4 from a lambda function
    // Equivalent to std::iota(v.begin(), v.end(), 0);
    std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
    println("v: ", v);
}

Salida:

v: 1 2 3 4 5
v: 0 1 2 3 4

Véase también

asigna por copia el valor dado a cada elemento en un rango
(plantilla de función & objeto función de algoritmo)
asigna los resultados de llamadas sucesivas a funciones a N elementos en un rango
(plantilla de función & objeto función de algoritmo)
(C++11)
llena un rango con incrementos sucesivos del valor inicial
(plantilla de función & objeto función de algoritmo)
guarda el resultado de una función en un rango
(objeto función de algoritmo)