Pour tout conteneur STL que j'utilise, si je déclare un itérateur (de ce type de conteneur particulier) à l'aide du constructeur par défaut de l'itérateur, à quoi l'itérateur sera-t-il initialisé?
Par exemple, j'ai:
std::list<void*> address_list;
std::list<void*>::iterator iter;
À quoi sera-t-il initialisé?
Par convention, un "itérateur NULL" pour les conteneurs, qui est utilisé pour indiquer aucun résultat, est égal au résultat de 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"
}
Cependant, étant donné qu'un itérateur de conteneur construit par défaut n'est associé à aucun conteneur particulier, il ne peut pas prendre une bonne valeur. Par conséquent, il s'agit simplement d'une variable non initialisée et la seule opération légale à faire avec elle est de lui affecter un itérateur valide.
std::vector<X>::iterator iter; //no particular value
iter = some_vector.begin(); //iter is now usable
Pour d'autres types d'itérateurs, cela peut ne pas être vrai. Par exemple en cas de istream_iterator
, un itérateur construit par défaut représente (se compare à) un istream_iterator
qui a atteint le EOF d'un flux d'entrée.
Le constructeur par défaut initialise un itérateur à une valeur singulière :
Les itérateurs peuvent également avoir des valeurs singulières qui ne sont associées à aucune séquence. [Exemple: après la déclaration d'un pointeur non initialisé x (comme avec int * x;), x doit toujours être supposé avoir une valeur singulière de pointeur. —Fin exemple] Les résultats de la plupart des expressions ne sont pas définis pour les valeurs singulières [24.2.1 §5]
L'itérateur n'est pas initialisé, tout comme int x;
déclare un entier qui n'est pas initialisé. Il n'a pas de valeur correctement définie.