最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<numeric>

# std::iota(C++11)

    namespace std {
      template <class ForwardIterator, class T>
      void
        iota(ForwardIterator first, ForwardIterator last, T value); // (1) C++11
      template <class ForwardIterator, class T>
      constexpr void
        iota(ForwardIterator first, ForwardIterator last, T value); // (1) C++20
    }

## 概要

指定された値から始まる整数列を生成する。

`iota()`関数は、値の範囲`[value, value + (last - first))`を前から順番に範囲`[first, last)`の各要素に代入する。

これは、連続した値のシーケンスが必要な場合に使用する。

## 要件

- `ForwardIterator`の値型が、型`T`に変換可能であること
- 型`T`の値`val`に対して、式`++val`が有効であること

## 効果

イテレータ範囲`[first, last)`の各要素`it`について、先頭から順番に `*it = value; ++value;` を行う

## 戻り値

なし

## 計算量

イテレータ範囲`[first, last)`の要素数をnとして、n回のインクリメントと代入が行われる。

## 備考

この関数は、APL言語の「原始関数ι（イオタ）」に由来する。

## 例

    #include <numeric>
    #include <iostream>
    #include <array>

    int main()
    {
      // 0から始まる10要素のシーケンスを作成する。
      // iota()関数に与えるシーケンスの要素数分だけ値が生成されるため、
      // 可変長のコンテナを与える場合には、事前に必要な要素数に
      // リサイズしておく必要がある
      std::array<int, 10> ar;
      std::iota(ar.begin(), ar.end(), 0);

      for (int x : ar) {
        std::cout << x << std::endl;
      }
    }

### 出力

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 4.5 ✅
- ICC: ??
- Visual C++: 2008 ✅

## 実装例

    template <class ForwardIterator, class T>
    void iota(ForwardIterator first, ForwardIterator last, T value)
    {
      for (; first != last; ++first) {
        *first = value;
        ++value;
      }
    }

## 参照

- N2569 More STL algorithms
- N2666 More STL algorithms (revision 2)
- P1645R1 `constexpr` for `<numeric>` algorithms
  - C++20で、並列バージョン以外の数値計算アルゴリズムが`constexpr`対応した