std::iota
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
| Определено в заголовочном файле <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
См. также
| присваивает диапазону элементов определённое значение (шаблон функции) | |
| присваивает результаты последовательных вызовов функции каждому элементу в диапазоне (шаблон функции) |