2009-05-05 10 views
22

Possible en double:
C++ Best way to check if an iterator is validComment vérifier si l'itérateur STL pointe sur quelque chose?

Je veux faire quelque chose comme ceci:

std::vector<int>::iterator it; 
// /cut/ search for something in vector and point iterator at it. 
if(!it) //check whether found 
    do_something(); 

Mais il n'y a pas d'opérateur! pour les itérateurs. Comment puis-je vérifier si l'itérateur pointe sur quelque chose?

+0

Cela n'a aucun sens d'utiliser un itérateur sans référence au conteneur itéré. Voir la réponse de James Hopkin. –

+0

clarifier l'obscurité Invalidation des Iterators STL: http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf – lsalamon

Répondre

46

Vous ne pouvez pas. L'idiome habituel consiste à utiliser l'itérateur de fin du conteneur comme un marqueur 'non trouvé'. C'est ce que std::find renvoie. La seule chose que vous pouvez faire avec un itérateur non assigné est d'assigner une valeur à celui-ci.

+1

Vous avez couvert le cas lorsque l'itérateur est initialisé et toujours valide. Cependant, certaines opérations sur certains conteneurs peuvent invalider les itérateurs. Par exemple, la suppression d'éléments d'un vecteur peut invalider les itérateurs (l'itérateur pointant vers le dernier élément du vecteur dans ce cas). –

+1

@ Cătălin: tout est vrai, mais hors de la portée de la question, je pense. Tout comme le! ('not') L'opérateur ne fonctionnera qu'avec des pointeurs valides ou nuls, ce qui précède ne fonctionnera qu'avec des itérateurs valides (y compris les itérateurs' end'). –

+0

La validité de l'itérateur est dans la portée des choses du programmeur. VOUS êtes le seul qui doit vous assurer que vous ne faites pas quelque chose de méchant avec vos itérateurs. – Spidey

0

Si vous souhaitez utiliser iterator dans une boucle, la meilleure façon de l'utiliser est de cette façon:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) 
{ 
do_smth(); 
} 
+0

En fait beaucoup d'algorithmes standards retournent des itérateurs (eg find) et des méthodes sur des conteneurs (eg map :: find) –

+0

C'est sûr sauf si la boucle fait 'effacer' car après l'effacement, 'ça' devient invalide et ensuite '++ c'est invalide. –

+0

Ne répond pas à la question – lalitm

2

Bien que les itérateurs sont considérés comme forme générale de pointeurs, ils ne sont pas exactement les pointeurs. La norme définit Past-the-end itérateur pour indiquer l'échec de la recherche dans les conteneurs. Par conséquent, il n'est pas recommandé de vérifier les itérateurs pour les valeurs NULL

Past-the-end sont non-singulières et non-référencables.

if(it != aVector.end()) //past-the-end iterator 
    do_something(); 
-3

Je crois que cela devrait vous donner généralement un bon test:

if (iterator._Mycont == &MyContainer) 
{ 
Probably a valid iterator! 
} 

Vous pouvez faire des tests pour vous assurer que l'itérateur ne fin pas égal ...

iterator != MyContainer.end() 

et:

iterator >= MyContainer.begin() 
+2

Cela semble extrêmement dépendant du compilateur (et de la version!). –

Questions connexes