2017-01-25 7 views
6

Angew made a comment生ポインタを反復子の型として使用しているvectorが正常であることを確認してください。それはちょっとループのために私を投げた。ポインタをコンテナイテレータとして使用する

私はそれを研究し始め、vectorイテレータのための要件は、彼らは明示的にポインタが適格と述べられている"Random Access Iterators"していることだけであることがわかった:

配列を満たすの要素へのポインタにすべての要件を

コンパイラがデバッグの目的でイテレータをvectorに提供する唯一の理由はあるのですか、実際には私がvectorで逃した要件はありますか?

+0

他の標準ライブラリとの一貫性の可能性が高くなります。 (コンテナ::イテレータi = c.begin(); i!= c.end(); ++ i){...}} 'テンプレートこのように 'iterator'、' begin'と 'end'を提供する限り、あなたが使うコンテナのタイプは気にしません。 – 0x5453

+0

@ 0x5453あなたは何を言っているのか分かりません。明らかに、コンテナはイテレータを返す必要があります。私はちょうど生のポインタを返すことが妥当だとは思わなかった。あなたはその声明に取り組んでいますか、それとも何か他のものに取り組んでいます –

+0

トリッキーな部分は、 'std :: vector :: iterator'のADL関連ネームスペースです。ポインタには、関連する名前空間として 'std'がありません。しかし、標準ではイテレータが関連する名前空間として 'std'を持つ必要はありません。 – MSalters

答えて

3

§24.2.1

イテレータはポインタの抽象化されているので、その意味は、C++でのポインタのセマンティクス のほとんどの一般化です。これにより、イテレータを使用するすべての関数テンプレートは、 の通常のポインタでも機能します。

したがって、ポインタを使用すると、Random Access Iteratorのすべての要件を満たします。

std::vectorは、おそらく標準ではそれが必要と言ういくつかの理由

  1. のためのイテレータを提供します。 std::vector一方コンテナなどstd::map又はstd::set提供イテレータのみvalue_type*ポインタを提供される場合

  2. は奇数であろう。イテレータは、コンテナライブラリ全体にわたって一貫性を提供します。

  3. ベクトルタイプの特殊化、たとえばstd::vector<bool>があり、value_type*ポインタは有効なイテレータではありません。

+0

"イテレーターはポインタの抽象化"というステートメントで "標準で言うべきです"とヒンジしていますか? –

+0

"ベクターにイテレータがある理由を説明している"という標準では、これがすべきだと述べています。数字2と3は、理由が2つあります。 – lcs

2

私の50セントは:

イテレータはどの STLコンテナにアクセスするための汎用的な方法です。私はあなたが言っていると感じている:ポインターはベクトルのイテレーターを置き換えるものとしてOKなので、なぜベクトルのイテレーターがあるのでしょうか?

C++で重複することはできないと言った人はいますか?実際には、同じ機能に異なるインターフェースを持たせることは良いことです。それは問題ではありません。

一方、イテレータを使用するアルゴリズムを持つライブラリについて考えてみましょう。ベクトルがイテレーターを持たない場合、それは例外への招待に過ぎません(プログラミングの意味ではなく、言語における例外)。アルゴリズムを書く必要があるたびに、ポインタ付きのベクトルでは何か違うことをしなければなりません。しかし、なぜ?この面倒な理由はありません。同じようにすべてのインタフェースを設定するだけです。

+0

イテレータとポインタでは、どのような操作を行う必要がありますか?私は実際には何も考えることができません。 –

+0

@JonathanMee私は彼のポイントは、イテレータは、他のクラスと同様に、ベクタークラスの特別な扱いを避けるために、イテレータを他のもののためにポインタを使って操作することを好む人には、例。 – Carmageddon

+0

@Carmageddonイテレータとポインタの動作がどう違うかの例を教えてください。これは、ポインタが異なる方法で扱われなければならない場合や、イテレータとは異なる方法で機能する必要がある場合に最適です。しかし、彼らが同じ演算子を提供し、同じ動作をしている場合、これは大きな答えではありません。 (私は何年もイテレータと互換性のあるポインターを使用してきました) –

2

何それらのコメントが言っていることは

template <typename T, ...> 
class vector 
{ 
public: 
    typedef T* iterator; 
    typedef const T* const_iterator; 
    ... 
private: 
    T* elems; // pointer to dynamic array 
    size_t count; 
    ... 
} 

が有効であることです。同様に、std::アルゴリズムと共に使用することを意図したユーザ定義コンテナもそれを行うことができる。そして、テンプレートがContainer::iteratorの型を尋ねると、のインスタンスはであり、それはT*であり、正しく動作します。

したがって、標準ではvectorにはvector::iteratorの定義があり、これをコードで使用する必要があります。あるプラットフォームでは、配列へのポインタとして実装されていますが、別のプラットフォーム上では別のものです。重要なことに、これらのことは、標準が指定するすべての側面で同じように動作します。

+0

私はこれがOPの本当の根底にある問題を解決する唯一の答えだと信じています。 – Angew

関連する問題