オブジェクト指向プログラミングにおいて、イテレータパターンとは、イテレータを用いてコンテナを走査し、その要素にアクセスするデザインパターンです。イテレータパターンはアルゴリズムとコンテナを分離しますが、場合によってはアルゴリズムがコンテナ固有のものであるため、分離できないこともあります。
例えば、想定されるアルゴリズムは、searchForElement()コンテナ固有のアルゴリズムとして実装するのではなく、特定のイテレータ型を用いて汎用的に実装することができます。これにより、searchForElement()必要なイテレータ型をサポートするあらゆるコンテナで使用可能になります。
イテレータ [ 1 ] デザインパターンは、 柔軟で再利用可能なオブジェクト指向ソフトウェア、つまり実装、変更、テスト、再利用が容易なオブジェクトを設計するために、繰り返し発生する設計上の問題を解決する方法を記述した、23の有名な「Gang of Four 」デザインパターンの1つ です。
集約インターフェースでアクセス操作と走査操作を定義すると、集約が特定のアクセス操作と走査操作に限定されてしまい、集約インターフェースを変更せずに後から新しい操作を追加することが不可能になるため、柔軟性に欠ける。
異なるイテレータを使用することで、集約へのアクセスや走査をさまざまな方法で行うことができます。 新しいイテレータを定義することで、新しいアクセス操作や走査操作を個別に定義できます。
下記のUMLクラス図およびシーケンス図も参照してください。
イテレータパターンの本質は、「基となる表現を公開することなく、集約オブジェクトの要素に順次アクセスする方法を提供する」ことである。[ 3 ]

上記のUMLクラス図において、Clientクラスは (1)オブジェクトAggregateを作成するためのインターフェースIterator( createIterator()) と (2)Iteratorオブジェクトを走査するためのインターフェースAggregate( next()、hasNext()) を参照しています。クラスは、クラスにアクセスすることでインターフェースIterator1を実装します。IteratorAggregate1
UMLシーケンス図は、 実行時の相互作用を示しています。オブジェクトはオブジェクトを呼び出し、オブジェクトはオブジェクトを作成してに返します。その後、はを使用してオブジェクトの要素を走査します。ClientcreateIterator()Aggregate1Iterator1ClientClientIterator1Aggregate1

構文を標準化しているプログラミング言語もある。C++とPythonはその代表的な例である。
C++では、イテレータはポインタのセマンティクスで実装されます。C++ では、クラスはすべてのポインタ操作をオーバーロードできるため、逆参照、インクリメント、デクリメントを備えた、ポインタとほぼ同じように動作するイテレータを実装できます。この利点は、C++ のアルゴリズムをstd::sort通常のメモリ バッファにすぐに適用でき、新しい構文を学ぶ必要がないことです。ただし、イテレータが末尾に到達したことを知るのではなく、等価性をテストするための「end」イテレータが必要になります。C++ 言語では、イテレータはイテレータの概念をモデル化すると言います。
このC++23実装は、「ベクトルの一般化を再び」の章に基づいています。[ 5 ]
import std ;template < typename T > using InitializerList = std :: initializer_list < T > ; using OutOfRangeException = std :: out_of_range ; template < typename T > using UniquePtr = std :: unique_ptr < T > ;class DoubleVector { private : UniquePtr < double [] > elements ; size_t listSize ; public : using Iterator = double * ;[[ nodiscard ]] Iterator begin () const noexcept { return elements ; }[[ nodiscard ]] Iterator end () const noexcept { return elements + listSize ; } DoubleVector ( InitializerList < double > list ) : elements { std :: make_unique < double [] > ( list . size ())}, listSize { list . size ()} { double * p = elements ; for ( auto i = list . begin (); i != list . end (); ++ i , ++ p ) { * p = * i ; } // または、 std::ranges::copy(list, elements.get())を使用して実装することもできます}~ DoubleVector () = default ;[[ nodiscard ]] size_t size () const noexcept { return listSize ; }[[ nodiscard ]] double & operator []( size_t n ) { if ( n >= listSize ) { throw OutOfRangeException ( "DoubleVector::operator[] が範囲外です!" ); } return elements [ n ]; }DoubleVector ( const DoubleVector & ) = delete ; // コピー構築を無効にするDoubleVector & operator = ( const DoubleVector & ) = delete ; // コピー代入を無効にする};int main ( int argc , char * argv []) { DoubleVector v = { 1.1 * 1.1 , 2.2 * 2.2 }; for ( const double & x : v ) { std :: println ( " {}" , x ); } for ( size_t i = v.begin ( ) ; i != v.end (); ++ i ) { std :: println ( "{}" , * i ); } for ( size_t i = 0 ; i <= v.size ( ) ; ++ i ) { std :: println ( "{}" , v [ i ]) ; } }プログラムの出力は
1.21 4.84 1.21 4.84 1.21 4.84 ' OutOfRangeException 'のインスタンスをスローした後にterminateが呼び出されました。内容() : DoubleVector :: operator []範囲外です!