Пространства имён
Варианты
Действия

std::iota

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <numeric>
template< class ForwardIterator, class T >
void iota( ForwardIterator first, ForwardIterator last, T value );
(начиная с C++11)
(до C++20)
template< class ForwardIt, class T >
constexpr void iota( ForwardIt first, ForwardIt last, T value );
(начиная с C++20)

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

Эквивалентная операция:

*(d_first)   = value;
*(d_first+1) = ++value;
*(d_first+2) = ++value;
*(d_first+3) = ++value;
...

Содержание

[править] Параметры

first, last диапазон элементов для заполнения последовательно увеличивающимися значениями начиная с value
value начальное значение для записи в диапазон; выражение ++value должно быть корректно определено (well-formed)

[править] Возвращаемое значение

(Нет)

[править] Сложность

Ровно last - first инкрементов и присваиваний.

[править] Возможная реализация

template<class ForwardIterator, class T>
constexpr // начиная с C++20
void iota(ForwardIterator first, ForwardIterator last, T value)
{
    while(first != last) {
        *first++ = value;
        ++value;
    }
}

[править] Примечания

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

[править] Пример

Данный код применяет std::shuffle к вектору итераторов списка std::list, т.к. std::shuffle не может быть применен к std::list напрямую. std::iota используется для заполнения обоих контейнеров.

#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>
 
int main()
{
    std::list<int> l(10);
    std::iota(l.begin(), l.end(), -4);
 
    std::vector<std::list<int>::iterator> v(l.size());
    std::iota(v.begin(), v.end(), l.begin());
 
    std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});
 
    std::cout << "Содержимое списка: ";
    for(auto n: l) std::cout << n << ' ';
    std::cout << '\n';
 
    std::cout << "Содержимое списка (перемешанное): ";
    for(auto i: v) std::cout << *i << ' ';
    std::cout << '\n';
}

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

Содержимое списка: -4 -3 -2 -1 0 1 2 3 4 5
Содержимое списка (перемешанное): 0 -1 3 4 -4 1 -2 -3 2 5

[править] См. также

присваивает диапазону элементов определённое значение
(шаблон функции) [править]
присваивает результаты последовательных вызовов функции каждому элементу в диапазоне
(шаблон функции) [править]