イテレータ【iterator】反復子
概要

通常、コレクションを走査する場合は繰り返し文と添字(インデックス)を組み合わせ、「0番目から要素数-1番目まで順に処理する」といったコードを記述する。この方法はデータ構造の内部実装に依存するため、対象が配列か連結リストか木構造かによってコードの書き方が変わってしまう。
イテレータを利用すると、「最初の要素を指し示す」「次の要素へ進む」「まだ要素が残っているか確認する」といった共通の操作だけで要素の走査を記述できる。データ構造ごとの違いを意識しなくても同じコードで処理できるため、プログラムの汎用性、可読性、保守性が向上する。
イテレータは現在どの要素を指しているかという状態を保持しながら順に移動し、末尾に達すると走査終了を示す。利用側は要素数や内部構造を知らなくても全要素を処理できる。コレクションの実装が変更されても、イテレータが同じ操作を提供していれば利用側のコードを変更せずに済む場合が多い。
多くのプログラミング言語では、イテレータの機能を提供するクラスやインターフェースが標準で用意されている。例えば、JavaではIteratorインターフェースとIterableインターフェース、C++言語ではSTLのイテレータ、Pythonでは__iter__と__next__メソッドによるイテレータプロトコルが定義されている。また、コレクションを生成できるオブジェクトを「イテラブル」(iterable)と呼び、イテレータはそこから実際に要素を一つずつ取り出す役割を持つ。この両者を分けることで、一つのコレクションに対して複数の独立した走査を同時に行えるようにもなる。
foreach文やfor-in文、for-of文といった繰り返し制御構文は、内部でイテレータを利用する仕組みになっているものが多く、利用者がイテレータの存在を意識しなくても自然にその恩恵を受けられる。C#やPythonのyieldキーワードを用いたジェネレータ構文では、大量のデータを一度にメモリに展開せず必要に応じて1要素ずつ生成できるため、メモリ消費を抑えた効率的な処理が可能となっている。