web-dev-qa-db-ja.com

イテレータのデフォルト値は何ですか?

私が使用しているSTLコンテナの場合、イテレータのデフォルトコンストラクタを使用して(この特定のコンテナタイプの)イテレータを宣言すると、イテレータは何に初期化されますか?

たとえば、私は持っています:

std::list<void*> address_list;
std::list<void*>::iterator iter;

Iterは何に初期化されますか?

58
The Void

慣例により、結果のないことを示すために使用されるコンテナの「NULLイテレータ」は、container.end()の結果と同等です。

 std::vector<X>::iterator iter = std::find(my_vec.begin(), my_vec.end(), x);
 if (iter == my_vec.end()) {
     //no result found; iter points to "nothing"
 }

ただし、デフォルトで構築されたコンテナイテレータは特定のコンテナに関連付けられていないため、適切な値はありません。したがって、これは初期化されていない変数であり、有効な唯一の操作は、有効な反復子を割り当てることです。

 std::vector<X>::iterator iter;  //no particular value
 iter = some_vector.begin();  //iter is now usable

他の種類の反復子の場合、これは当てはまらない場合があります。たとえば、istream_iteratorの場合、デフォルトで構成されたイテレータは、入力ストリームのEOF)に達したistream_iteratorを表します(等しい)。

52
UncleBens

デフォルトのコンストラクターは、イテレーターを特異値に初期化します。

イテレータは、シーケンスに関連付けられていない特異値を持つこともできます。 [例:初期化されていないポインターxの宣言後(int * x;と同様)、xは常にポインターの特異値を持っていると想定する必要があります。 —例の終了] 特異値の場合、ほとんどの式の結果は未定義 [24.2.1§5]

22
fredoverflow

int x;が初期化されていない整数を宣言するように、イテレーターは初期化されません。適切に定義された値がありません。

11
JesperE