Spec-Zone.ru › C++

std::iota

Эта страница посвящена алгоритмам генерации возрастающих целочисленных диапазонов, известным как последовательности iota по названию функции из APL, использующей греческую букву ι. Это не связано с преобразованием ASCII-строки в целое число в стиле C — atoi.
Определён в заголовочном файле <numeric>
template< class ForwardIt, class T >
void iota( ForwardIt first, ForwardIt last, T value );
(начиная с C++11)
(constexpr начиная с C++20)

Заполняет диапазон [first, last) последовательно возрастающими значениями, начиная с value и каждый раз вычисляя ++value.

Эквивалентная операция (если считать, что ++value возвращает увеличенное значение):

*first   = value;
*++first = ++value;
*++first = ++value;
*++first = ++value;
// repeats until “last” is reached

Если выполнено любое из следующих условий, программа некорректна:

  • T не преобразуется к типу значения ForwardIt.
  • Выражение ++val некорректно, где val — переменная типа T.

Параметры

first, last - пара итераторов, определяющая диапазон элементов, который нужно заполнить последовательно возрастающими значениями, начиная с value
value - начальное значение для записи

Сложность

Ровно std::distance(first, last) операций инкремента и присваивания.

Возможная реализация

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

Примечания

Функция названа в честь целочисленной функции ⍳ из языка программирования APL. Она была одним из компонентов STL, не вошедших в C++98, но включённых в стандартную библиотеку в C++11.

Пример

В следующем примере std::shuffle применяется к vector итераторам std::list. std::iota используется для заполнения контейнеров.

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>

class BigData // inefficient to copy
{
    int data[1024]; /* some raw data */
public:
    explicit BigData(int i = 0) { data[0] = i; /* ... */ }
    operator int() const { return data[0]; }
    BigData& operator=(int i) { data[0] = i; return *this; }
    /* ... */
};

int main()
{
    std::list<BigData> l(10);
    std::iota(l.begin(), l.end(), -4);
    
    std::vector<std::list<BigData>::iterator> v(l.size());
    std::iota(v.begin(), v.end(), l.begin());
    // Vector of iterators (to original data) is used to avoid expensive copying,
    // and because std::shuffle (below) cannot be applied to a std::list directly.
    
    std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});
    
    std::cout << "Original contents of the list l:\t";
    for (const auto& n : l)
        std::cout << std::setw(2) << n << ' ';
    std::cout << '\n';
    
    std::cout << "Contents of l, viewed via shuffled v:\t";
    for (const auto i : v)
        std::cout << std::setw(2) << *i << ' ';
    std::cout << '\n';
}

Возможный вывод:

Original contents of the list l:        -4 -3 -2 -1  0  1  2  3  4  5
Contents of l, viewed via shuffled v:        -1  5 -4  0  2  1  4 -2  3 -3

См. также

ranges::iota
(C++23)
заполняет диапазон последовательными приращениями начального значения
(объект-функция алгоритма)
fill
копирующим присваиванием записывает заданное значение в каждый элемент диапазона
(шаблон функции и объект-функция алгоритма)
ranges::fill
(C++20)
ranges::fill
(C++20)
присваивает элементам диапазона заданное значение
(объект-функция алгоритма)
generate
присваивает каждому элементу диапазона результаты последовательных вызовов функции
(шаблон функции и объект-функция алгоритма)
ranges::generate
(C++20)
ranges::generate
(C++20)
сохраняет результат функции в диапазоне
(объект-функция алгоритма)
ranges::iota_viewviews::iota
(C++20)
view, состоящий из последовательности, полученной многократным увеличением начального значения
(шаблон класса) (объект точки настройки)
views::indices
(C++26)
view, генерирующий последовательность возрастающих значений от 0 до n
(объект точки настройки)
ranges::enumerate_viewviews::enumerate
(C++23)
view, преобразующий каждый элемент адаптированной последовательности в кортеж, содержащий позицию элемента и его значение
(шаблон класса) (объект адаптера диапазона)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/iota

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API