最終的には、STL が (90 年代初頭に Stepanov によって) 発明され、後に C++ 標準化プロセスで承認されたときに、反復子がポインターの一般化になるという決定が下されました。http://www.sgi.com/tech/stl/stl_introduction.htmlから:
C 配列を逆にする例では、reverse の引数は明らかに型double*
です。ただし、ベクトルまたはリストを逆にする場合、逆にする引数は何ですか? ... 答えは、reverse の引数は、ポインタの一般化であるイテレータです。
イテレータはポインタの一般化である必要はありませんでした。first
C++ 標準ライブラリ (およびそれ以前の STL) は、理論的には異なる反復モデルを使用できました。このモデルでは、反復は、反復子とのペアではなく、単一の反復子オブジェクトまたは単一の範囲オブジェクトのいずれかで表されますlast
。
性能差はあまりないと思います。確かに、最新の C++ コンパイラにはありません。STL (およびそれに基づく標準ライブラリ) は常に、コンパイラによる適切なインライン展開にパフォーマンスを依存しており、これらのクラスは、コンパイラがコンテナーの内部で既に処理しなければならないものよりも悪くはありません。また、ポインターのペアを反復子または範囲オブジェクトに変換する単純なラッパーを提供することも、大きな問題にはなりません。
他のイテレータ モデルを好む人もいます。James Gosling (または、Java イテレータを設計した人物) です。また、範囲を好む人もいます (多くの C++ プログラマーを含む: したがって Boost.Range)。
STL と C++ の作成者は、STL スタイルのイテレータが C とのある種の互換性を保持しているという事実、つまりポインタを使用して配列 (またはユーザーがポインターのペア)、ほとんど変更せずに、反復子を使用してコンテナー (または他の範囲) を操作する C++ アルゴリズムに変換します。これは、新しい言語が既存のユーザー ベースにより容易に同化できることを意味する考え方です。これは、初期の C++ の目標の 1 つでした。
そのため、「ポインタをイテレータではなく、イテレータを大きくすることを犠牲にして、数文字短い end をテストする手段を提供できないか」などの質問は、おそらく当時はあまり関心がなかったでしょう。たとえば、Andrei Alexandrescu は、彼の意見では、これはもはや最良の選択ではなく、範囲は反復子よりも優れているとしばらくの間言い続けてきました。