The Wayback Machine - https://web.archive.org/web/20220419230014/https://es.cppreference.com/w/cpp/algorithm/ranges/iota
Espacios de nombres
Variantes
Acciones

std::ranges::iota, std::ranges::iota_result

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
(C++11)
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 <numeric>
Signatura de la llamada
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> iota( O first, S last, T value );
(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 crecientes secuencialmente 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));
    }
};
 
inline constexpr iota_fn iota;

[editar] Notes

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] Example

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.

#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 un cierto valor a una serie de elementos
(plantilla de función) [editar]
Asigna un cierto valor a un rango de elementos.
(niebloid) [editar]
Guarda el resultado de una función en un rango.
(plantilla de función) [editar]
Guarda el resultado de una función en un rango.
(niebloid) [editar]
Una vista (view) que consiste en una secuencia generada al incrementar repetidamente un valor inicial.
(plantilla de clase) (objeto de punto de personalización) [editar]
(C++11)
Llena un rango con incrementos sucesivos del mismo valor de partida
(plantilla de función) [editar]