これは私の試験の質問です。答えはすべてのポインタがイテレータですが、すべてのイテレータがポインタではないということです。これはなぜですか? pは全くイテレータと考えることができますどのようにすべてのポインタはイテレータと見なされますか?
int *p = new int(4);
次のような声明の中で
?
これは私の試験の質問です。答えはすべてのポインタがイテレータですが、すべてのイテレータがポインタではないということです。これはなぜですか? pは全くイテレータと考えることができますどのようにすべてのポインタはイテレータと見なされますか?
int *p = new int(4);
次のような声明の中で
?
「反復子」は、抽象概念であり、型が特定のセマンティクスでサポートしなければならない特定の一連の操作を記述します。
ポインタは、コンセプトiteratorを満たしています(さらに、より強く、random access iterator)。 operator++
は次の要素に移動し、operator *
は下位の要素にアクセスします。あなたの特定の例では
、あなたはどんなイテレータのペアのような標準的なアルゴリズム、例のために使用することができる
[p, p+1)
と標準イテレータ範囲を取得します。 (これは特に有用ではないかもしれませんが、それでも有効です。)上記のことは、すべての "有効な"ポインタ、すなわちあるオブジェクトを指すポインタに当てはまります。
しかし、逆の意味は誤っています。たとえば、std::list<T>::iterator
を考えてみましょう。それはまだ反復子ですが、operator[]
がないためポインタにすることはできません。
ポインタなしでイテレータを実装することはできますか? – Bob
@Bobそれはどういう意味ですか?ポインタではないイテレータですか?私の答えの最後の段落を参照してください。ポインタを使用して実装できないイテレータおそらく、ポインタは何もしないポインタを落とすことができます。ポインタはすでに最も強いイテレータカテゴリにあります。 –
ポインタのための 'iterator_traits'の実装なしでは、ポインタでさえ、最新の標準のイテレータとして完全に修飾されていないことに注意してください。 –
ポインタはポインタです。イテレータはイテレータです。配列内のいくつかの要素へのポインタは、ランダムアクセスイテレータのすべての要件を満たしています。他のポインタ、...あまりそうではありません。 –
@SamVarshavchik私の考えは正確ですが、私はすべてのポインタがイテレータである理由を理解していません – Bob
"すべてのポインタがイテレータです"というブランケットステートメントはfalseです。 –