

C++言語においてイテレータとポインタの違いは何ですか


CC BY-SA 3.0
2015-02-21T17:52:06.690
6882
2015-02-22T07:23:42.503
2015-02-22T07:23:42.503
7978
question
c++ 言語仕様
イテレータとポインタの違い


イテレータはポインタのようなインターフェースをクラスやテンプレートを用いて実現したものです。  
なので、実体は単にポインタかもしれないしポインタではないかもしれません。  
イテレータはポインタの様に使えますが、  
種類によって５種類のイテレータがあり、ポインタと違っていつでも`++`,`\--`,`*`,`[
]`がポインタの様に使えたりイテレータ同士を比較できたりということはありません(何ができるかは種類によって異なる)。


CC BY-SA 3.0
2015-02-21T18:55:25.743
6884
2015-02-21T18:55:25.743
5044
6882
answer


  * 「ポインタ(pointer)」とは、 **型(type)の一種** であり、 **C++言語仕様** の一部として定義されます。
  * 「イテレータ(iterator)」とは、 **一定の要件(requirement)を満たす任意の型** のことを指し、その要件とは **C++標準ライブラリの仕様** にて規定されます。
  * 「ポインタ」は「イテレータ」の一種と考えることができます。配列型というコンテナにおけるイテレータが、ポインタ型です。

* * *

C++標準ライブラリ（の基になったSTL）では、「コンテナ」「イテレータ」「アルゴリズム」という3つの構成要素から成り立ちます。

イテレータが存在しなかった場合、`copy()`や`sort()`や`find()`といった様々なアルゴリズムを、コンテナ種別(`vector`,
`deque`, `list`...)毎に用意しなければなりません。つまりN種類のアルゴリズム×M種類のコンテナでは、(N × M)
個の実装関数が必要になってしまいます。

実際には、アルゴリズム中で直接操作する対象はコンテナそのものではなく、コンテナの“要素を指すポインタ的なもの”に対する処理となります。この“
**コンテナ要素を指すポインタ的なもの**
”が「イテレータ」です。またイテレータの特性は、そのコンテナによって提供可能な機能が決まります。アルゴリズムをコンテナ毎ではなくイテレータ毎に用意することで、N種類のアルゴリズム＋m種類のイテレータの実装、つまり
(N ＋ m) 個の実装関数におさえることができます。


CC BY-SA 3.0
2015-02-22T05:02:09.193
6905
2015-02-22T05:07:23.143
2015-02-22T05:07:23.143
49
49
6882
answer