イテレータライブラリ
イテレータライブラリは5種類 (C++17未満)6種類 (C++17以上)のイテレータ、イテレータ特性、アダプタ、ユーティリティ関数に対する定義を提供します。
目次 |
[編集] イテレータのカテゴリ
LegacyInputIterator, LegacyOutputIterator, LegacyForwardIterator, LegacyBidirectionalIterator, LegacyRandomAccessIterator, LegacyContiguousIterator (C++17以上) の 5種類 (C++17未満)6種類 (C++17以上)のイテレータがあります。
特定の型を定義する代わりに、イテレータの各々のカテゴリは実行可能な操作によって定義されます。 つまり必要な操作をサポートするあらゆる型をイテレータとして使用できるという意味です。 例えば、ポインタは LegacyRandomAccessIterator の要求する操作をすべてサポートしているため、 LegacyRandomAccessIterator が期待されるあらゆる場所でポインタを使用することができます。
すべてのイテレータのカテゴリ (LegacyOutputIterator を除く) は階層的に整理できます。 より強力なイテレータカテゴリ (例えば LegacyRandomAccessIterator) はそれより強力でないカテゴリ (例えば LegacyInputIterator) の操作もサポートします。 イテレータがこれらのカテゴリのいずれかに分類され、さらに LegacyOutputIterator の要件も満たす場合、そのイテレータは可変イテレータと呼ばれ、入力と出力の両方をサポートします。 可変でないイテレータは定数イテレータと呼ばれます。
| イテレータのカテゴリ | 定義されている操作 | ||||
|---|---|---|---|---|---|
| LegacyContiguousIterator | LegacyRandomAccessIterator | LegacyBidirectionalIterator | LegacyForwardIterator | LegacyInputIterator |
|
| |||||
| |||||
| |||||
| |||||
|
上記のカテゴリのいずれかに分類され、さらに LegacyOutputIterator の要件も満たすイテレータは、可変イテレータと呼ばれます。 | |||||
| LegacyOutputIterator |
| ||||
ノート: LegacyContiguousIterator カテゴリは C++17 で正式に規定されたものですが、 C++17 以前のコードでも std::vector, std::basic_string, std::array, std::valarray のイテレータおよび C の配列へのポインタはしばしば別のカテゴリとして扱われていました。
|
C++20 のイテレータコンセプトC++20 では C++17 のイテレータと異なるコンセプトをベースとした新しいイテレータのシステムが導入されます。 基本的な分類は同じままですが、個別のイテレータカテゴリに対する要件は若干異なります。
イテレータの関連型
イテレータのカスタマイゼーションポイント
|
(C++20以上) | ||||||||||||||||||||||||||||||||||||||||||
[編集] イテレータプリミティブ
| イテレータの性質への統一されたインタフェースを提供します (クラステンプレート) | |
| イテレータのカテゴリを表すために使用される空のクラス型 (クラス) | |
| (C++17で非推奨) |
シンプルなイテレータのための型要件の定義を簡単にする基底クラス (クラステンプレート) |
[編集] イテレータアダプタ
| 逆順探索のためのイテレータアダプタ (クラステンプレート) | |
| (C++14) |
引数から推定した型の std::reverse_iterator を作成します (関数テンプレート) |
| (C++11) |
右辺値参照を逆参照するイテレータアダプタ (クラステンプレート) |
| (C++20) |
std::move_iterator と共に使用するための番兵アダプタ (クラステンプレート) |
| (C++11) |
引数から推定した型の std::move_iterator を作成します (関数テンプレート) |
| (C++20) |
イテレータ型とその番兵を共通イテレータ型に適合させます (クラステンプレート) |
| (C++20) |
範囲の境界を知っているイテレータと共に使用するためのデフォルトの番兵 (クラス) |
| (C++20) |
範囲の終端までの距離を追跡するイテレータアダプタ (クラステンプレート) |
| (C++20) |
いかなる weakly_incrementable 型とも常に等しくないと比較される番兵 (クラス) |
| コンテナの末尾に挿入するためのイテレータアダプタ (クラステンプレート) | |
| 引数から推定した型の std::back_insert_iterator を作成します (関数テンプレート) | |
| コンテナの先頭に挿入するためのイテレータアダプタ (クラステンプレート) | |
| 引数から推定した型の std::front_insert_iterator を作成します (関数テンプレート) | |
| コンテナに挿入するためのイテレータアダプタ (クラステンプレート) | |
| 引数から推定した型の std::insert_iterator を作成します (関数テンプレート) |
[編集] ストリームイテレータ
| std::basic_istream から読み込む入力イテレータ (クラステンプレート) | |
| std::basic_ostream に書き込む出力イテレータ (クラステンプレート) | |
| std::basic_streambuf から読み込む入力イテレータ (クラステンプレート) | |
| std::basic_streambuf に書き込む出力イテレータ (クラステンプレート) |
[編集] イテレータの操作
| ヘッダ
<iterator> で定義 | |
| イテレータを指定された距離だけ前進させます (関数) | |
| 2つのイテレータ間の距離を返します (関数) | |
| (C++11) |
イテレータをインクリメントします (関数) |
| (C++11) |
イテレータをデクリメントします (関数) |
| (C++20) |
イテレータを指定された距離または指定された境界まで前進させます (ニーブロイド) |
| (C++20) |
イテレータと番兵の間または範囲の先頭と終端の間の距離を返します (ニーブロイド) |
| (C++20) |
イテレータを指定された距離または境界までインクリメントします (ニーブロイド) |
| (C++20) |
イテレータを指定された距離または境界までデクリメントします (ニーブロイド) |
[編集] 範囲アクセス
これらの非メンバ関数はコンテナ、普通の配列、 std::initializer_list に対する汎用のインタフェースを提供します。
| ヘッダ
<iterator> で定義 | |
| 名前空間
std で定義 | |
| (C++11)(C++14) |
コンテナまたは配列の先頭を指すイテレータを返します (関数) |
| (C++11)(C++14) |
コンテナまたは配列の終端を指すイテレータを返します (関数) |
| (C++14) |
コンテナまたは配列の先頭を指す逆イテレータを返します (関数) |
| (C++14) |
コンテナまたは配列の終端を指す逆イテレータを返します (関数) |
| (C++17)(C++20) |
コンテナまたは配列のサイズを返します (関数テンプレート) |
| (C++17) |
コンテナが空かどうか調べます (関数) |
| (C++17) |
ベースとなる配列を指すポインタを取得します (関数) |
| ヘッダ
<ranges> で定義 | |
| 名前空間
std::ranges で定義 | |
| (C++20) |
範囲の先頭を指すイテレータを返します (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
範囲の終端を指すイテレータを返します (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
範囲の逆イテレータを返します (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
範囲の逆終端イテレータを返します (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
サイズが定数時間で計算可能な範囲のサイズを取得します (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
範囲が空かどうか調べます (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
隣接範囲の先頭を指すポインタを取得します (カスタマイゼーションポイントオブジェクト) |

