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.