web-dev-qa-db-fra.com

Quelle est la valeur par défaut d'un itérateur?

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é?

58
The Void

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.

52
UncleBens

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]

22
fredoverflow

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.

11
JesperE