配列や連結リストなど、複数の要素が集まったデータ構造に対して、各要素への反復処理を抽象化したオブジェクトやメソッド、関数や文法機能といったもののことです。
反復処理を抽象化することで、対象のデータ構造がどのようなかたちのものであっても(要素が連続的に並んでいる、ポインタなどで非連続的につながれているなどの違い)、同様のコードが使えるようになります。次のコードは架空のプログラミング言語での例です。
foreach (var e : container) {
print e;
}
container は何らかのデータ構造で表現された要素の集まりです。foreach
は反復処理を行うためのキーワードであり、container
の中から要素を1つ選び、変数 e
によって間接参照できるようにします。{}
の内側の処理を終えると、次の要素を選ぶことから再開します。この過程が、container
の末尾の要素の処理を終えるまで繰り返されます。
container が、int container[] = {0, 1, 2};
のような配列だったとしても、LinkedList<int> container = {0, 1, 2};
のような連結リストだったとしても、ほかのデータ構造であったとしても、上記のコードがそのまま使用できるはずです。
C++ では、STL (Standard Template Library) の中に、イテレータが登場します。STL におけるイテレータは、多数あるコンテナ(データ構造)と、多数あるアルゴリズム(コンテナを操作する関数)とのあいだをつなぎ、両者の依存性を小さく抑える(組み合わせのパターン数を抑える)役割をもっています。
C++ のイテレータに関しては、C++編【標準ライブラリ】第14章で解説しています。
たとえば次のコードは、STL のアルゴリズム std::find() を使い、コンテナから 100 という値をもった要素を探しています。このコードは、変数 v があらわすコンテナの種類が変更されても、そのままコンパイルできる可能性が高いものです。
auto it = std::find(std::begin(v), std::end(v), 100);
if (it != std::end(v)) {
std::cout << *it << std::endl;
}
ここで、std::begin()、std::end()、std::find() が返すものがイテレータです。
イテレータの型は、コンテナの種類によって異なります。たとえば、std::vector
のためのイテレータと、std::list
のためのイテレータは別の型です。ですから、イテレータそのものが共通化されているわけではありません。
イテレータは、対象のコンテナの特性に応じてカテゴリという概念で分類されており、カテゴリごとに可能な操作が定義されています。カテゴリが同じなら、イテレータの型は違っていても同じ操作ができます。また、カテゴリには階層的な関係性があり、上位のカテゴリで行える操作は、下位のカテゴリでも行えるようになっています。詳細は、C++編【標準ライブラリ】第14章を参照してください。
また、最初に示した foreach の例に対応するものとして、範囲for文があります。
for (auto e : container) {
std::cout << e;
}
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |