std::iota - cppreference.com

From cppreference.com

This page is about the algorithms for generating increasing integer ranges, known as iota sequences after APL's use of the Greek letter ι. This is unrelated to the C-style ASCII-to-integer conversion,

atoi

.template<classForwardIt,classT>voidiota(ForwardItfirst,ForwardItlast,Tvalue);(since C++11)
(constexpr since C++20)Fills the range [first, last) with sequentially increasing values, starting with value and repetitively evaluating ++value.

Equivalent operation (assuming ++value returns the incremented value):

*first=value;*++first=++value;*++first=++value;*++first=++value;// repeats until “last” is reachedIf any of the following conditions is satisfied, the program is ill-formed:

T is not convertible to the

value type

of ForwardIt.

The expression ++val is ill-formed, where val is a variable of type T.

Parameters

first, last - the pair of iterators defining the

range

of elements to fill with sequentially increasing values starting with valuevalue - initial value to store Complexity

Exactly std::distance(first,last) increments and assignments.

Possible implementation

template<classForwardIt,classT>constexpr// since C++20voidiota(ForwardItfirst,ForwardItlast,Tvalue){for(;first!=last;++first,++value)*first=value;}Notes

The function is named after the integer function ⍳ from the programming language

APL

. It was one of the

STL components

that were not included in C++98, but made it into the standard library in C++11.

Example

The following example applies

std::shuffle

to a

vector

of

std::list

s' iterators. std::iota is used to populate containers.

Run this code

#include<algorithm>#include<iomanip>#include<iostream>#include<list>#include<numeric>#include<random>#include<vector>classBigData// inefficient to copy{intdata[1024];/* some raw data */public:explicitBigData(inti=0){data[0]=i;/* ... */}operatorint()const{returndata[0];}BigData&operator=(inti){data[0]=i;return*this;}/* ... */};intmain(){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(constauto&n:l)std::cout<<std::setw(2)<<n<<' ';std::cout<<'\n';std::cout<<"Contents of l, viewed via shuffled v:\t";for(constautoi:v)std::cout<<std::setw(2)<<*i<<' ';std::cout<<'\n';}Possible output:

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 See also

ranges::iota

(C++23)

fills a range with successive increments of the starting value
(algorithm function object)

[edit]

fill

copy-assigns the given value to every element in a range
(function template & algorithm function object)

[edit]

ranges::fill

(C++20)

ranges::fill

(C++20)

assigns a range of elements a certain value
(algorithm function object)

[edit]

generate

assigns the results of successive function calls to every element in a range
(function template & algorithm function object)

[edit]

ranges::generate

(C++20)

ranges::generate

(C++20)

saves the result of a function in a range
(algorithm function object)

[edit]

ranges::iota_viewviews::iota

(C++20)

a

view

consisting of a sequence generated by repeatedly incrementing an initial value
(class template)(customization point object)

[edit]

views::indices

(C++26)

a

view

that generates a sequence of increasing values from 0 up to n
(customization point object)

[edit]

ranges::enumerate_viewviews::enumerate

(C++23)

a

view

that maps each element of adapted sequence to a tuple of both the element's position and its value
(class template)(range adaptor object)

[edit]