私が使用しているSTLコンテナの場合、イテレータのデフォルトコンストラクタを使用して(この特定のコンテナタイプの)イテレータを宣言すると、イテレータは何に初期化されますか?
たとえば、私は持っています:
std::list<void*> address_list;
std::list<void*>::iterator iter;
Iterは何に初期化されますか?
慣例により、結果のないことを示すために使用されるコンテナの「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
を表します(等しい)。
デフォルトのコンストラクターは、イテレーターを特異値に初期化します。
イテレータは、シーケンスに関連付けられていない特異値を持つこともできます。 [例:初期化されていないポインターxの宣言後(int * x;と同様)、xは常にポインターの特異値を持っていると想定する必要があります。 —例の終了] 特異値の場合、ほとんどの式の結果は未定義 [24.2.1§5]
int x;
が初期化されていない整数を宣言するように、イテレーターは初期化されません。適切に定義された値がありません。