vector.end() == 0 ?
-
Hi!
Ich habe ein Objekt vector<xyz> obj. Beim durch-iterieren wurde irgendwie immer über das Ende rausgegangen, abgefragt hab ich mit
vector<XYZ>::iterator pos = obj.begin(); vector<XYZ>::iterator end = obj.end(); while ( pos != end ) ...Gewundert hab ich mich, die Ausgabe der Pointer der Iteratoren ergaben für pos einen validen Pointer auf ein Objekt von XYZ (außer beim drübergehen natürlich), der "Wert" von end war 0. Beim ausprobieren von anderen Vektoren war end immer ein "gültiger" Wert, also *obj.begin() + obj.size()sizeof(XYZ).
Ist das normal oder an was könnte das liegen? Der vector hat definitv gültige Werte, ist normal deklariert und alles, nur .end() gibt einen NULL-Pointer zurück
-
Und was ist jetzt daran so ungewöhnlich das end null ist? Ich finde das ist ein durchaus legitimer Wert.
-
Hm, finde ich nicht.. Jedenfalls kann ich so nicht durch die Elemente iterieren

edit: Ach verflucht, jetzt gehts
War ein verteufelt dämlicher Fehler

Aber danke fürs Antworten!
-
@Badestrand: Wie ist denn vector<>::end() definiert? Ich kann mir nicht vorstellen, daß dort NULL herauskommen sollte (außer eventuell bei einem komplett leeren Vector)
Artchi schrieb:
Und was ist jetzt daran so ungewöhnlich das end null ist? Ich finde das ist ein durchaus legitimer Wert.
Bestimmt nicht - end() sollte schon die Position hinter dem letzten Datenelement liefern, alles andere wäre nicht standardkonform.
-
ja, end() ist bei meinem VS 2003 so definiert
iterator end() { return (iterator(_Mylast)); }deshalb hatte ich mich auch gewundert... Und du hast Recht, ausversehen hab ich end() von einem leeren Vektor aufgerufen, das nächste mal weiß ich Bescheid

Wie es passiert ist (wirklich dämlich, aber ich hab echt lange zum Entdecken gebraucht):
Ich hab eine Baum-Struktur:struct Expression { string text; vector<Expression> expr; };Durch die erste Ebene der Expressions hab ich durchiteriert, bei einem bestimmten Punkt gehe ich in die zweite Ebene:
vector<Expression>::const_iterator pos = expressions.begin(); vector<Expression>::const_iterator end = expressions.end(); //... if ( pos->text=="()" && pos->expr.size()>0 ) { // Die Iteratoren werden jetzt auf die nächste Ebene gesetzt pos = pos->expr.begin(); // Das ist natürlich in Ordnung... end = pos->expr.end(); // ...und das natürlich Schwachfug, der nächstuntere Vektor war leer... //... }Wie man sieht war's wirklich ein wenig doof, aber ich bin froh, dass ich's jetzt raushab... Und ich bin mir wirklich sicher, das passiert mir nie wieder

^Oder wenn es passiert, bekomm ich es gaaaaanz schnell raus :)^edit: und ich musste jetzt natürlich nur die zwei Zeilen der Neuzuweisungen vertauschen.