std::ranges::iota, std::ranges::iota_result
De cppreference.com
Definido en el archivo de encabezado <numeric> | ||
Signatura de la llamada | ||
template<std::input_or_output_iterator O, std::sentinel_for<O> S, std::weakly_incrementable T > | (1) | (desde C++23) |
template<std::weakly_incrementable T, ranges::output_range<const T&> R > constexpr iota_result<ranges::borrowed_iterator_t<R>, T> iota( R&& r, T value ); | (2) | (desde C++23) |
Tipos auxiliares | ||
template<class O, class T > using iota_result =ranges::out_value_result<O, T>; | (3) | (desde C++23) |
Llena el rango [first, last)
con valores secuencialmente crecientes, comenzando con value
y evaluando repetitivamente ++value.
Operación equivalente:
*(first)= value;*(first+1)=++value;*(first+2)=++value;*(first+3)=++value; ...
Contenido |
[editar]Parámetros
first, last | - | El rango de elementos a llenar con valores secuencialmente crecientes comenzando con value . |
value | - | Valor inicial a almacenar; la expresión ++value debe estar bien formada. |
[editar]Valor de retorno
{last, value +ranges::distance(first, last)}
[editar]Complejidad
Exactamente last - first
incrementos y asignaciones.
[editar]Posible implementación
struct iota_fn {template<std::input_or_output_iterator O, std::sentinel_for<O> S, std::weakly_incrementable T > requires std::indirectly_writable<O, const T&>constexpr iota_result<O, T> operator()(O first, S last, T value)const{while(first != last){*first = as_const(value);++first;++value;}return{std::move(first), std::move(value)};} template<std::weakly_incrementable T, std::ranges::output_range<const T&> R >constexpr iota_result<std::ranges::borrowed_iterator_t<R>, T> operator()(R&& r, T value)const{return(*this)(std::ranges::begin(r), std::ranges::end(r), std::move(value));}}; inlineconstexpr iota_fn iota; |
[editar]Notas
La función lleva el nombre de la función entera ⍳ del lenguaje de programación APL.
Macro de Prueba de característica |
---|
__cpp_lib_ranges_iota |
[editar]Ejemplo
El siguiente ejemplo aplica ranges::shuffle a un vector de iteradores de std::list, ya que ranges::shuffle no se puede aplicar directamente a std::list. ranges::iota
se usa para llenar ambos contenedores.
Ejecuta este código
#include <algorithm>#include <iostream>#include <list>#include <numeric>#include <random>#include <vector> int main(){std::list<int> l(10); std::ranges::iota(l.begin(), l.end(), -4); std::vector<std::list<int>::iterator> v(l.size()); std::ranges::iota(v, l.begin()); std::ranges::shuffle(v, std::mt19937{std::random_device{}()}); std::cout<<"Contenido de la lista: ";for(auto n: l)std::cout<< n <<' ';std::cout<<'\n'; std::cout<<"Contenido de la lista, barajada: ";for(auto i: v)std::cout<<*i <<' ';std::cout<<'\n';}
Posible salida:
Contenido de la lista: -4 -3 -2 -1 0 1 2 3 4 5 Contenido de la lista, barajada: 0 -1 3 4 -4 1 -2 -3 2 5
[editar]Véase también
Asigna por copia el valor dado a todos los elementos de un rango. (plantilla de función) | |
(C++20) | Asigna un cierto valor a un rango de elementos. (niebloid) |
Asigna el resultado de las llamadas sucesivas de una función a todos los elementos de un rango. (plantilla de función) | |
(C++20) | Guarda el resultado de una función en un rango. (niebloid) |
(C++20) | Una vista (view ) que consiste en una secuencia generada al incrementar repetidamente un valor inicial. (plantilla de clase)(objeto punto de personalización) |
(C++11) | Llena un rango con incrementos sucesivos del mismo valor de partida (plantilla de función) |