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,
.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
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
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
. It was one of the
that were not included in C++98, but made it into the standard library in C++11.
Example
The following example applies
to a
of
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
(C++23)
fills a range with successive increments of the starting value
(algorithm function object)
copy-assigns the given value to every element in a range
(function template & algorithm function object)
(C++20)
(C++20)
assigns a range of elements a certain value
(algorithm function object)
assigns the results of successive function calls to every element in a range
(function template & algorithm function object)
(C++20)
(C++20)
saves the result of a function in a range
(algorithm function object)
(C++20)
a
consisting of a sequence generated by repeatedly incrementing an initial value
(class template)(customization point object)
(C++26)
a
that generates a sequence of increasing values from 0 up to n
(customization point object)
ranges::enumerate_viewviews::enumerate
(C++23)
a
that maps each element of adapted sequence to a tuple of both the element's position and its value
(class template)(range adaptor object)