最終更新日時(UTC): 2025年07月08日 15時33分39秒
Akira Takahashi が更新

履歴 編集

function template
<numeric>

# std::ranges::iota(C++23)

    namespace std::ranges {
      // (1)
      template<input_or_output_iterator O, sentinel_for<O> S, weakly_incrementable T>
        requires indirectly_writable<O, const T&>
      constexpr iota_result<O, T> iota(O first, S last, T value);

      // (2)
      template<weakly_incrementable T, output_range<const T&> R>
      constexpr iota_result<borrowed_iterator_t<R>, T> iota(R&& r, T value);
    }

## 概要

指定された値から始まる、インクリメント演算子による増加列を生成する。

- (1): イテレータ範囲を指定する
- (2): Rangeを直接指定する

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

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

## 効果

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

## 戻り値

`{ .out = last, .value = value + (last - first) }`

## 計算量

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

## 備考

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

## 例

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

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

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

### 出力

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `std::ranges::iota_view`: 増加列を遅延評価で生成するRangeファクトリ

## 参照

- N4901 25 Algorithms library