先頭へ戻る

イテレータ | Programming Place Plus 用語集

Programming Place Plus トップページ -- 用語集

先頭へ戻る

名称


解説

配列連結リストなど、複数の要素が集まったデータ構造に対して、各要素への反復処理抽象化したオブジェクトメソッド関数や文法機能といったもののことです。

反復処理を抽象化することで、対象のデータ構造がどのようなかたちのものであっても(要素が連続的に並んでいる、ポインタなどで非連続的につながれているなどの違い)、同様のコードが使えるようになります。次のコードは架空のプログラミング言語での例です。

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++ の場合

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 でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー