2009-05-05 9 views
22

Mögliche Duplizieren:
C++ Best way to check if an iterator is validWie überprüft man, ob der STL-Iterator auf irgendwas zeigt?

ich so etwas wie dies tun wollen:

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

Aber es gibt keinen Operator! für Iteratoren. Wie kann ich überprüfen, ob Iteratoren auf irgendetwas zeigen?

+0

Es macht keinen Sinn, ein zu verwenden Iterator ohne Bezug auf den Container, den es iteriert. Siehe James Hopkins Antwort. –

+0

Klärung der Dunkelheit Erklärung der STL-Iteratoren: http://www.angelikananger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf – lsalamon

Antwort

46

Sie können nicht. Das übliche Idiom ist es, den Ende-Iterator des Containers als "nicht gefunden" -Marker zu verwenden. Dies ist, was std::find zurückgibt.

Das einzige, was Sie mit einem nicht zugewiesenen Iterator tun können, ist, ihm einen Wert zuzuweisen.

+1

Sie haben den Fall behandelt, als der Iterator initialisiert und noch gültig ist. Einige Operationen in einigen Containern können jedoch die Iteratoren ungültig machen. Zum Beispiel kann das Entfernen von Elementen aus einem Vektor Iteratoren ungültig machen (der Iterator zeigt in diesem Fall auf das letzte Element im Vektor). –

+1

@ Catalin: das ist alles wahr, aber außerhalb des Bereichs der Frage, denke ich. Genau wie das! ('not') -Operator wird nur mit gültigen oder Null-Zeigern arbeiten, die oben genannten funktionieren nur mit gültigen Iteratoren (einschließlich' end'-Iteratoren). –

+0

Die Gültigkeit des Iterators liegt im Bereich der Dinge, über die sich der Programmierer Gedanken machen muss. SIE sind die einzigen, die sicherstellen müssen, dass Sie mit Ihren Iteratoren nichts Böses tun. – Spidey

0

Wenn Sie Iterator in einer Schleife verwenden möchten, die sicherste Art und Weise zu verwenden, um es auf diese Weise ist:

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

Tatsächlich geben viele Standard-Algorithmen Iteratoren (zB find) und Methoden auf Containern zurück (zB map :: find) –

+0

Es ist sicher, es sei denn, die Schleife löscht (it) weil nach dem Löschen 'es' ungültig wird und anschließend '++ es ist ungültig. –

+0

Beantwortet die Frage nicht – lalitm

2

Obwohl die Iteratoren als allgemeine Form von Zeigern betrachtet werden, sind sie nicht genau die Zeiger. Der Standard definiert Past-the-end Iterator, um den Suchfehler in Containern anzugeben. Daher ist es nicht empfehlenswert, die Iteratoren für NULL zu überprüfen

Past-the-end Werte sind nicht singulär und nicht referenzierbar.

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

Ich glaube, dies sollte im Allgemeinen geben Ihnen einen guten Test:

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

Sie Tests durchführen könnten, um sicherzustellen, dass der Iterator nicht gleich das Ende ...

iterator != MyContainer.end() 

und:

iterator >= MyContainer.begin() 
+2

Scheint extrem Compiler (und Version!) Abhängig. –

Verwandte Themen