名前空間
変種
操作

イテレータライブラリ

提供: cppreference.com
< cpp

イテレータライブラリは5種類 (C++17未満)6種類 (C++17以上)のイテレータ、イテレータ特性、アダプタ、ユーティリティ関数に対する定義を提供します。

目次

[編集] イテレータのカテゴリ

LegacyInputIterator, LegacyOutputIterator, LegacyForwardIterator, LegacyBidirectionalIterator, LegacyRandomAccessIterator, LegacyContiguousIterator (C++17以上)5種類 (C++17未満)6種類 (C++17以上)のイテレータがあります。

特定の型を定義する代わりに、イテレータの各々のカテゴリは実行可能な操作によって定義されます。 つまり必要な操作をサポートするあらゆる型をイテレータとして使用できるという意味です。 例えば、ポインタは LegacyRandomAccessIterator の要求する操作をすべてサポートしているため、 LegacyRandomAccessIterator が期待されるあらゆる場所でポインタを使用することができます。

すべてのイテレータのカテゴリ (LegacyOutputIterator および LegacyContiguousIterator を除く) は階層的に整理できます。 より強力なイテレータカテゴリ (例えば LegacyRandomAccessIterator) はそれより強力でないカテゴリ (例えば LegacyInputIterator) の操作もサポートします。 イテレータがこれらのカテゴリのいずれかに分類され、さらに LegacyOutputIterator の要件も満たす場合、そのイテレータは可変イテレータと呼ばれ、入力と出力の両方をサポートします。 可変でないイテレータは定数イテレータと呼ばれます。

イテレータのカテゴリ 定義されている操作
LegacyRandomAccessIterator LegacyBidirectionalIterator LegacyForwardIterator LegacyInputIterator
  • 読み込み
  • インクリメント (シングルパス)
  • インクリメント (マルチパス)
  • デクリメント
  • ランダムアクセス

上記のカテゴリのいずれかに分類され、さらに LegacyOutputIterator の要件も満たすイテレータは、可変イテレータと呼ばれます。

LegacyOutputIterator
  • 書き込み
  • インクリメント (シングルパス)

上記のカテゴリのいずれかに分類され、さらに LegacyContiguousIterator の要件も満たすイテレータは、隣接イテレータと呼ばれます。

LegacyContiguousIterator
  • 隣接した記憶域

ノート: LegacyContiguousIterator カテゴリは C++17 で正式に規定されたものですが、 C++17 以前のコードでも std::vector, std::basic_string, std::array, std::valarray のイテレータおよび C の配列へのポインタはしばしば別のカテゴリとして扱われていました。


C++20 のイテレータコンセプト

C++20 では C++17 のイテレータと異なるコンセプトをベースとした新しいイテレータのシステムが導入されます。 基本的な分類は同じままですが、個別のイテレータカテゴリに対する要件は若干異なります。

名前空間 std で定義
型が * 演算子を適用することによって読み込み可能であることを指定します
(コンセプト) [edit]
イテレータの参照先のオブジェクトに値を書き込めることを指定します
(コンセプト) [edit]
前置または後置インクリメント演算子で Semiregular 型をインクリメントできることを指定します
(コンセプト) [edit]
WeaklyIncrementable 型に対するインクリメント演算が等しさを維持することおよびその型が EqualityComparable であることを指定します
(コンセプト) [edit]
その型のオブジェクトがインクリメントおよび逆参照できることを指定します
(コンセプト) [edit]
型が Iterator 型に対する番兵であることを指定します
(コンセプト) [edit]
差を定数時間で計算するためにイテレータと番兵に - 演算子を適用できることを指定します
(コンセプト) [edit]
型が入力イテレータである、つまり、参照先の値を読むことができ、前置および後置インクリメントの両方ができることを指定します
(コンセプト) [edit]
型が指定された型のための出力イテレータである、つまり、その型の値を書き込むことができ、前置および後置インクリメントの両方ができること指定します
(コンセプト) [edit]
InputIterator が前進イテレータであり、等しさの比較とマルチパスをサポートすることを指定します
(コンセプト) [edit]
ForwardIterator が双方向イテレータであり、逆方向の移動をサポートすることを指定します
(コンセプト) [edit]
BidirectionalIterator がランダムアクセスイテレータであり、定数時間での前進および添字アクセスをサポートすることを指定します
(コンセプト) [edit]
RandomAccessIterator が隣接イテレータであり、メモリ内で隣接する要素を参照していることを指定します
(コンセプト) [edit]

イテレータの関連型

名前空間 std で定義
WeaklyIncrementable 型の差型を計算します
(クラステンプレート) [edit]
Readable 型の値型を計算します
(クラステンプレート) [edit]
イテレータの関連型を計算します
(エイリアステンプレート) [edit]

イテレータのカスタマイゼーションポイント

名前空間 std::ranges で定義
オブジェクトを逆参照した結果をその関連する右辺値参照型にキャストします
(カスタマイゼーションポイントオブジェクト) [edit]
2つの逆参照可能オブジェクトの参照先の値を入れ替えます
(カスタマイゼーションポイントオブジェクト) [edit]
(C++20以上)

[編集] イテレータプリミティブ

イテレータの性質への統一されたインタフェースを提供します
(クラステンプレート) [edit]
イテレータのカテゴリを表すために使用される空のクラス型
(クラス) [edit]
(C++17で非推奨)
シンプルなイテレータのための型要件の定義を簡単にする基底クラス
(クラステンプレート) [edit]

[編集] イテレータアダプタ

逆順探索のためのイテレータアダプタ
(クラステンプレート) [edit]
引数から推定した型の std::reverse_iterator を作成します
(関数テンプレート) [edit]
右辺値参照を逆参照するイテレータアダプタ
(クラステンプレート) [edit]
std::move_iterator と共に使用するための番兵アダプタ
(クラステンプレート) [edit]
引数から推定した型の std::move_iterator を作成します
(関数テンプレート) [edit]
イテレータ型とその番兵を共通イテレータ型に適合させます
(クラステンプレート) [edit]
範囲の境界を知っているイテレータと共に使用するためのデフォルトの番兵
(クラス) [edit]
範囲の終端までの距離を追跡するイテレータアダプタ
(クラステンプレート) [edit]
いかなる WeaklyIncrementable 型とも常に等しくないと比較される番兵
(クラステンプレート) [edit]
コンテナの末尾に挿入するためのイテレータアダプタ
(クラステンプレート) [edit]
引数から推定した型の std::back_insert_iterator を作成します
(関数テンプレート) [edit]
コンテナの先頭に挿入するためのイテレータアダプタ
(クラステンプレート) [edit]
引数から推定した型の std::front_insert_iterator を作成します
(関数テンプレート) [edit]
コンテナに挿入するためのイテレータアダプタ
(クラステンプレート) [edit]
引数から推定した型の std::insert_iterator を作成します
(関数テンプレート) [edit]

[編集] ストリームイテレータ

std::basic_istream から読み込む入力イテレータ
(クラステンプレート) [edit]
std::basic_ostream に書き込む出力イテレータ
(クラステンプレート) [edit]
std::basic_streambuf から読み込む入力イテレータ
(クラステンプレート) [edit]
std::basic_streambuf に書き込む出力イテレータ
(クラステンプレート) [edit]

[編集] イテレータの操作

ヘッダ <iterator> で定義
イテレータを指定された距離だけ前進させます
(関数) [edit]
2つのイテレータ間の距離を返します
(関数) [edit]
(C++11)
イテレータをインクリメントします
(関数) [edit]
(C++11)
イテレータをデクリメントします
(関数) [edit]
イテレータを指定された距離または指定された境界まで前進させます
(niebloid) [edit]
イテレータと番兵の間または範囲の先頭と終端の間の距離を返します
(niebloid) [edit]
イテレータを指定された距離または境界までインクリメントします
(niebloid) [edit]
イテレータを指定された距離または境界までデクリメントします
(niebloid) [edit]

[編集] 範囲アクセス

これらの非メンバ関数はコンテナ、普通の配列、 std::initializer_list に対する汎用のインタフェースを提供します。

ヘッダ <iterator> で定義
名前空間 std で定義
(C++11)(C++14)
コンテナまたは配列の先頭を指すイテレータを返します
(関数) [edit]
(C++11)(C++14)
コンテナまたは配列の終端を指すイテレータを返します
(関数) [edit]
コンテナまたは配列の先頭を指す逆イテレータを返します
(関数) [edit]
(C++14)
コンテナまたは配列の終端を指す逆イテレータを返します
(関数) [edit]
ヘッダ <ranges> で定義
名前空間 std::ranges で定義
範囲の先頭を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の終端を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の逆イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の逆終端イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]

[編集] コンテナアクセス

これらの非メンバ関数はコンテナ、普通の配列、 std::initializer_list に対する汎用のインタフェースを提供します。

ヘッダ <iterator> で定義
(C++17)
コンテナまたは配列のサイズを返します
(関数) [edit]
(C++17)
コンテナが空かどうか調べます
(関数) [edit]
(C++17)
ベースとなる配列を指すポインタを取得します
(関数) [edit]
ヘッダ <ranges> で定義
名前空間 std::ranges で定義
サイズが定数時間で計算可能な範囲のサイズを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲が空かどうか調べます
(カスタマイゼーションポイントオブジェクト) [edit]
隣接範囲の先頭を指すポインタを取得します
(カスタマイゼーションポイントオブジェクト) [edit]