24.2.1/1 [iterator.requirements.general] はそれをうまくまとめています:
反復子は、C++ プログラムがさまざまなデータ構造 (コンテナー) を統一された方法で操作できるようにするポインターの一般化です。さまざまなタイプのデータ構造で正しく効率的に機能するテンプレート アルゴリズムを構築できるようにするために、ライブラリはインターフェイスだけでなく、イテレータのセマンティクスと複雑さの仮定も形式化します。
「ポインターの一般化」というフレーズは、ポインターが反復子であることを意味します。std::vector<T>::iterator
typedef にすることができますT *
。ただし、ほとんどの反復子は、演算子のオーバーロードによってインターフェイスを実現します。(イテレータもコンテナに属している必要はないことに注意してください。)
このような言語は、C++ 標準の記述方法の非常に典型的なものです。物事がどのように動作するかを説明しますが、基本クラスの観点からインターフェイスを定義することは避けます。入力、出力、順方向、双方向、ランダムアクセスなど、さまざまな種類の反復子があります。それぞれに異なる仕様があり、ランダム アクセスは双方向インターフェイスの厳密なスーパーセットですが、C++ 型システムではまったく関係ありません。
++
イテレータは、オーバーロードされた任意のクラス*
、および の有効な特殊化である可能性がありstd::iterator_traits
ます。必要なインターフェースを定義するために使用する基本クラスがあります。これは、C++ のジェネリック プログラミングと特性クラスの良いケース スタディです。std::iterator
std::iterator_traits