Espacios de nombres
Variantes
Acciones

std::ranges::generate

De cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
Algoritmos restringidos
Operaciones de secuencia no modificantes
Operaciones de secuencia modificantes
Operaciones en almacenamiento sin inicializar
Operaciones de partición
Operaciones de ordenamiento
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo/montón
Operaciones de mínimo/máximo
Permutaciones
 
Definido en el archivo de encabezado <algorithm>
Signatura de la 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&>>
constexprranges::borrowed_iterator_t<R>

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

Las entidades similares a funciones descritas en esta página son niebloids, es decir:

En la práctica, pueden implementarse como objetos función o con extensiones de compilador especiales.

Contenido

[editar]Parámetros

first, last - El rango de los elementos a modificar.
r - El rango de los elementos a modificar.
gen - El objeto función generador.

[editar]Valor de retorno

Un iterador de salida que se compara igual que last.

[editar]Complejidad

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

[editar]Posible implementación

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&>>constexprranges::borrowed_iterator_t<R> operator()(R&& r, F gen)const{return(*this)(ranges::begin(r), ranges::end(r), std::move(gen));}};   inlineconstexpr generate_fn generate {};

[editar]Ejemplo

#include <algorithm>#include <array>#include <iostream>#include <random>#include <string_view>   auto dado()// representa un dado{staticstd::uniform_int_distribution<int> distr {1, 6};staticstd::random_device device;staticstd::mt19937 engine {device()};return distr(engine);}   void iota(auto& v, int n){ std::ranges::generate(v, [&n]() mutable {return n++;});}   void print(std::string_view comment, constauto& 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(), dado); print("dado: ", v); std::ranges::generate(v, dado); print("dado: ", v);   iota(v, 1); print("iota: ", v);}

Posible salida:

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

[editar]Véase también

Guarda el resultado de N aplicaciones de una función.
(niebloid)[editar]
Asigna un cierto valor a un rango de elementos.
(niebloid)[editar]
Asigna un valor a un número de elementos.
(niebloid)[editar]
Aplica una función a un rango de elementos.
(niebloid)[editar]
Asigna el resultado de las llamadas sucesivas de una función a todos los elementos de un rango.
(plantilla de función)[editar]
close