2016-12-17 10 views
4

これは私の試験の質問です。答えはすべてのポインタがイテレータですが、すべてのイテレータがポインタではないということです。これはなぜですか? pは全くイテレータと考えることができますどのようにすべてのポインタはイテレータと見なされますか?

int *p = new int(4); 

次のような声明の中で

+2

ポインタはポインタです。イテレータはイテレータです。配列内のいくつかの要素へのポインタは、ランダムアクセスイテレータのすべての要件を満たしています。他のポインタ、...あまりそうではありません。 –

+0

@SamVarshavchik私の考えは正確ですが、私はすべてのポインタがイテレータである理由を理解していません – Bob

+1

"すべてのポインタがイテレータです"というブランケットステートメントはfalseです。 –

答えて

10

「反復子」は、抽象概念であり、型が特定のセマンティクスでサポートしなければならない特定の一連の操作を記述します。

ポインタは、コンセプトiteratorを満たしています(さらに、より強く、random access iterator)。 operator++は次の要素に移動し、operator *は下位の要素にアクセスします。あなたの特定の例では

、あなたはどんなイテレータのペアのような標準的なアルゴリズム、例のために使用することができる

[p, p+1) 

と標準イテレータ範囲を取得します。 (これは特に有用ではないかもしれませんが、それでも有効です。)上記のことは、すべての "有効な"ポインタ、すなわちあるオブジェクトを指すポインタに当てはまります。

しかし、逆の意味は誤っています。たとえば、std::list<T>::iteratorを考えてみましょう。それはまだ反復子ですが、operator[]がないためポインタにすることはできません。

+0

ポインタなしでイテレータを実装することはできますか? – Bob

+1

@Bobそれはどういう意味ですか?ポインタではないイテレータですか?私の答えの最後の段落を参照してください。ポインタを使用して実装できないイテレータおそらく、ポインタは何もしないポインタを落とすことができます。ポインタはすでに最も強いイテレータカテゴリにあります。 –

+0

ポインタのための 'iterator_traits'の実装なしでは、ポインタでさえ、最新の標準のイテレータとして完全に修飾されていないことに注意してください。 –

関連する問題