std::generate
De es.cppreference.net
< cpp | Algoritmos
| 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:
|
|
(hasta C++20) |
|
|
(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:
El tipo | ||||||
| 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
ExecutionPolicyes una de las políticas estándar, std::terminate es llamada. Para cualquier otraExecutionPolicy, 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
Ejecutar este código
#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) | |
(C++20) |
|
| asigna los resultados de llamadas sucesivas a funciones a N elementos en un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
llena un rango con incrementos sucesivos del valor inicial (plantilla de función & objeto función de algoritmo) |
(C++23) |
|
(C++20) |
guarda el resultado de una función en un rango (objeto función de algoritmo) |