最終更新日時(UTC): 2025年06月25日 13時48分21秒
suomesta が更新

履歴 編集

<iterator>

# iterator

`<iterator>`ヘッダでは、イテレータに関する機能群を提供する。 イテレータは日本語では反復子とも呼ばれ、配列やコンテナのような範囲を横断する手段として使用できる。

C++標準ライブラリのイテレータは、以下のように階層的に定義される。 この階層はC++言語機能の継承と同じように見なせる。たとえば、入力イテレータと前方向イテレータはis a関係が成り立っており、前方向イテレータは入力イテレータと見なすことができる。

C++20以降の標準ライブラリでは、任意のイテレータに対して可能な操作によって上記5つに隣接イテレータ（contiguous iterator）を加えた6つのイテレータカテゴリを定義する。それぞれ次のイテレータコンセプトが対応する。

- 入力イテレータ : `input_iterator`
- 出力イテレータ : `output_iterator`
- 前方向イテレータ : `forward_iterator`
- 双方向イテレータ : `bidirectional_iterator`
- ランダムアクセスイテレータ : `random_access_iterator`
- 隣接イテレータ : `contiguous_iterator`

このヘッダでは、以下の標準ヘッダをインクルードする：

- `<concepts>` (C++20)
- `<compare>` (C++20)

## イテレータコンセプト

名前 | 説明 | 対応バージョン
--- | --- | ---
`indirectly_readable` | 間接参照によって読み取り可能 (concept) | C++20
`indirectly_writable` | 間接参照によって書き込み可能 (concept) | C++20
`weakly_incrementable` | 前置/後置インクリメント可能 (concept) | C++20
`incrementable` | `weakly_incrementable`かつ正則 (concept) | C++20
`input_or_output_iterator` | 基礎的なイテレータコンセプト (concept) | C++20
`sentinel_for` | 同じ範囲についてのイテレータと番兵 (concept) | C++20
`sized_sentinel_for` | 距離を定義可能なイテレータ (concept) | C++20
`disable_sized_sentinel_for` | `sentinel_for<S, I>`について、`sized_sentinel_for`を不適合にする (variable template) | C++20
`input_iterator` | 入力イテレータ (concept) | C++20
`output_iterator` | 出力イテレータ (concept) | C++20
`forward_iterator` | 前方向イテレータ (concept) | C++20
`bidirectional_iterator` | 双方向イテレータ (concept) | C++20
`random_access_iterator` | ランダムアクセスイテレータ (concept) | C++20
`contiguous_iterator` | 隣接イテレータ (concept) | C++20

## イテレータを介した関数呼び出しに関するコンセプト

名前 | 説明 | 対応バージョン
--- | --- | ---
`indirectly_unary_invocable` | イテレータの要素型によって呼び出し可能 (concept) | C++20
`indirectly_regular_unary_invocable` | 正則な`indirectly_unary_invocable` (concept) | C++20
`indirect_unary_predicate` | イテレータの要素型についての単項述語 (concept) | C++20
`indirect_binary_predicate` | 2つのイテレータの要素型についての二項述語 (concept) | C++20
`indirect_equivalence_relation` | 2つのイテレータの要素型についての同値関係 (concept) | C++20
`indirect_strict_weak_order` | 2つのイテレータの要素型についての狭義の弱順序 (concept) | C++20

## イテレータによるアルゴリズムに関するコンセプト

名前 | 説明 | 対応バージョン
--- | --- | ---
`indirectly_movable` | 片方のイテレータからもう片方のイテレータへ要素をムーブ可能 (concept) | C++20
`indirectly_movable_storable` | 片方のイテレータからもう片方のイテレータへ中間オブジェクトを介して要素をムーブ可能 (concept) | C++20
`indirectly_copyable` | 片方のイテレータからもう片方のイテレータへ要素をコピー可能 (concept) | C++20
`indirectly_copyable_storable` | 片方のイテレータからもう片方のイテレータへ中間オブジェクトを介して要素をコピー可能 (concept) | C++20
`indirectly_swappable` | 2つのイテレータ間で要素を交換可能 (concept) | C++20
`indirectly_comparable` | 2つのイテレータ間で要素を比較可能 (concept) | C++20
`permutable` | イテレータを介して要素を並べ替え可能 (concept) | C++20
`mergeable` | イテレータを介して範囲をマージ可能 (concept) | C++20
`sortable` | イテレータを介して範囲をソート可能 (concept) | C++20

## イテレータの情報

名前 | 説明 | 対応バージョン
--- | --- | ---
`iterator_traits` | イテレータに関する型情報(class template) |
`iterator` | イテレータを定義するための基底クラス(class template) | C++17から非推奨
`iter_difference_t` | イテレータの`difference_type`を取得する (alias template) | C++20
`iter_value_t` | イテレータの`value_type`を取得する (alias template) | C++20
`iter_reference_t` | イテレータの`reference_type`を取得する (alias template) | C++20
`iter_rvalue_reference_t` | イテレータの指す要素の右辺値参照型を取得する (alias template) | C++20
`iter_common_reference_t` | イテレータの`value_type`と`reference_type`の`common_reference`を取得する (alias template) | C++20
`iter_const_reference_t` | イテレータの参照型（`iter_reference_t`）を`const`化したものを取得する (alias template) | C++23
`indirect_result_t` | 関数呼び出し可能な型`F`を複数のイテレータ`Is...`によって呼び出した時の戻り値型を取得する (alias template) | C++20
`projected` | イテレータ`I`の`Proj`による射影操作の結果を表すことのできる`indirectly_readable`なクラス (class template) | C++20
`projected_value_t` | イテレータ`I`の`Proj`による射影操作の結果となる値型を取得する (alias template) | C++26
`incrementable_traits` | `iter_difference_t`にアダプトするためのカスタマイゼーションポイント (class template) | C++20
`indirectly_readable_traits` | `iter_value_t`にアダプトするためのカスタマイゼーションポイント (class template) | C++20
`input_iterator_tag` | 入力イテレータを表すタグ(class) |
`output_iterator_tag` | 出力イテレータを表すタグ(class) |
`forward_iterator_tag` | 前方向イテレータを表すタグ(class) |
`bidirectional_iterator_tag` | 双方向イテレータを表すタグ(class) |
`random_access_iterator_tag` | ランダムアクセスイテレータを表すタグ(class) |
`contiguous_iterator_tag` | 隣接イテレータを表すタグ(class) | C++20

## イテレータの進行と距離

名前 | 説明 | 対応バージョン
--- | --- | ---
`advance` | `n`回イテレータを進める(function template) |
`distance` | イテレータ間の距離を求める(function template) |
`next` | `n`回前方に進めたイテレータを返す(function template) | C++11
`prev` | `n`回後方に進めたイテレータを返す(function template) | C++11
`ranges::advance` | イテレータを進める(function template) | C++20
`ranges::distance` | 範囲の長さを求める(function template) | C++20
`ranges::next` | 前方に進めたイテレータを返す(function template) | C++20
`ranges::prev` | 後方に進めたイテレータを返す(function template) | C++20

## 逆順イテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`reverse_iterator` | 逆方向に進むイテレータアダプタ(class template) |
`make_reverse_iterator` | `reverse_iterator`オブジェクトを作るヘルパ関数(function template) | C++14

## 挿入イテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`back_insert_iterator` | 末尾に要素を挿入する出力イテレータアダプタ(class template) |
`back_inserter` | `back_insert_iterator`オブジェクトを作るヘルパ関数(function template) |
`front_insert_iterator` | 先頭に要素を挿入する出力イテレータアダプタ(class template) |
`front_inserter` | `front_insert_iterator`オブジェクトを作るヘルパ関数(function template) |
`insert_iterator` | 任意の位置に要素を挿入する出力イテレータアダプタ(class template) |
`inserter` | `insert_iterator`オブジェクトを作るヘルパ関数(function template) |

## 要素を移動するイテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`move_iterator` | 間接参照時にムーブするイテレータアダプタ(class template) | C++11
`make_move_iterator` | `move_iterator`オブジェクトを作るヘルパ関数(function template) | C++11
`move_sentinel` | `move_iterator`の終端を表す番兵型(class template) | C++20

## ストリームイテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`istream_iterator` | 入力ストリームイテレータ(class template) |
`ostream_iterator` | 出力ストリームイテレータ(class template) |
`istreambuf_iterator` | 入力ストリームバッファイテレータ(class template) |
`ostreambuf_iterator` | 出力ストリームバッファイテレータ(class template) |

## 定数イテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`basic_const_iterator` | イテレータの要素を`const`化するラッパーイテレータ(class template) | C++23
`const_iterator` | 要素が`const`化されたイテレータ型を取得する (alias template) | C++23
`const_sentinel` | 要素が`const`化された番兵型を取得する (alias template) | C++23
`make_const_iterator` | `const_iterator`オブジェクトを作るヘルパ関数(function template) | C++23
`make_const_sentinel` | `const_sentinel`オブジェクトを作るヘルパ関数(function template) | C++23

## その他のイテレータアダプタ

名前 | 説明 | 対応バージョン
--- | --- | ---
`common_iterator` | イテレータ型と番兵型が異なる場合に型を共通化するためのラッパーイテレータ(class template) | C++20
`counted_iterator` | 予め指定された`N`個の要素だけをイテレートするラッパーイテレータ(class template) | C++20

## 番兵型

名前 | 説明 | 対応バージョン
--- | --- | ---
`default_sentinel_t` | 任意の範囲の終端を表すことのできるデフォルトの番兵型(class template) | C++20
`default_sentinel` | 任意の範囲の終端を表すことのできるデフォルトの番兵オブジェクト(constant variable) | C++20
`unreachable_sentinel_t` | 別の方法で終端が指定される範囲の仮想的な終端を表す番兵型(class template) | C++20
`unreachable_sentinel` | 別の方法で終端が指定される範囲の仮想的な終端を表す番兵オブジェクト(class template) | C++20

## 先頭イテレータと末尾イテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`begin` | 範囲の先頭を指すイテレータを取得する(function template) | C++11
`end` | 範囲の末尾の次を指すイテレータを取得する(function template) | C++11
`cbegin` | 範囲の先頭を指す読み取り専用イテレータを取得する(function template) | C++14
`cend` | 範囲の末尾の次を指す読み取り専用イテレータを取得する(function template) | C++14
`rbegin` | 範囲の末尾を指す逆イテレータを取得する(function template) | C++14
`rend` | 範囲の先頭の前を指す逆イテレータを取得する(function template) | C++14
`crbegin` | 範囲の末尾を指す読み取り専用逆イテレータを取得する(function template) | C++14
`crend` | 範囲の先頭の前を指す読み取り専用逆イテレータを取得する(function template) | C++14

## コンテナアクセス

名前 | 説明 | 対応バージョン
--- | --- | ---
`size` | コンテナの要素数を取得する (function) | C++17
`ssize` | コンテナの要素数を、符号付き整数型で取得する (function) | C++20
`empty` | コンテナが空かどうかを判定する (function) | C++17
`data` | コンテナの要素配列へのポインタを取得する (function) | C++17

## カスタマイゼーションポイントオブジェクト

名前 | 説明 | 対応バージョン
--- | --- | ---
`ranges::iter_move` | イテレータの指す要素をムーブする (customization point object) | C++20
`ranges::iter_swap` | 2つのイテレータの指す要素をswapする (customization point object) | C++20

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
- P2051R0 C++ Standard Library Issues to be moved in Prague
- P2278R4 `cbegin` should always return a constant iterator