Skip to main content

std::iota() algorithm

// (1)
template< class ForwardIt, class T >
constexpr void iota( ForwardIt first, ForwardIt last, T value );

Fills the range [first; last) with sequentially increasing values, starting with value and repetitively evaluating ++value.

Equivalent operation:

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

Parameters​

first
second

The range of elements to fill with sequentially increasing values starting from value.

value

Initial value to store.

Type requirements​

++value

Must be well-formed.

Return value​

(none)

Complexity​

Exactly last - first increments and assignments.

Exceptions​

(none)

Possible implementation​

iota(1)
template<class ForwardIt, class T>
constexpr // since C++20
void iota(ForwardIt first, ForwardIt last, T value)
{
while (first != last)
{
*first++ = value;
++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.

Examples​

Main.cpp
#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 (auto const& n : l) std::cout << std::setw(2) << n << ' ';
std::cout << '\n';

std::cout << "Contents of l, viewed via shuffled v:\t";
for (auto const i : v) std::cout << std::setw(2) << *i << ' ';
std::cout << '\n';
}
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
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.

std::iota() algorithm

// (1)
template< class ForwardIt, class T >
constexpr void iota( ForwardIt first, ForwardIt last, T value );

Fills the range [first; last) with sequentially increasing values, starting with value and repetitively evaluating ++value.

Equivalent operation:

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

Parameters​

first
second

The range of elements to fill with sequentially increasing values starting from value.

value

Initial value to store.

Type requirements​

++value

Must be well-formed.

Return value​

(none)

Complexity​

Exactly last - first increments and assignments.

Exceptions​

(none)

Possible implementation​

iota(1)
template<class ForwardIt, class T>
constexpr // since C++20
void iota(ForwardIt first, ForwardIt last, T value)
{
while (first != last)
{
*first++ = value;
++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.

Examples​

Main.cpp
#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 (auto const& n : l) std::cout << std::setw(2) << n << ' ';
std::cout << '\n';

std::cout << "Contents of l, viewed via shuffled v:\t";
for (auto const i : v) std::cout << std::setw(2) << *i << ' ';
std::cout << '\n';
}
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
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.