Iterator pointer
-
Ich iteriere ne liste und will testen, ob der iterator gerade auf front zeigt, ist es richtig, den Iterator so aufzulösen:
for(std::list<Foo>::iterator iter = bar.begin(); iter != bar.end(); ++iter) { if(&*iter==&bar.front()) {...} }Es kompiliert, aber ist es semantisch korrekt?
-
Vergleiche den Iterator lieber mit begin(). Das liefert ja auch einen Iterator.
if(iter==bar.begin())
-
Naja ich prüfe aber auch auf bar.back() und das ist nicht äquivalent mit bar.end()
-
Was hat das damit zu tun? Deswegen kannst du doch trotzdem gegen begin() prüfen.
Der Iterator auf das letzte Element ist dann end()-1
-
Braunstein schrieb:
Der Iterator auf das letzte Element ist dann end()-1
Oder rbegin().
Alternativ:
std::list<Foo>::iterator last = bar.end(); std::list<Foo>::iterator end = last--; for(std::list<Foo>::iterator iter = bar.begin(); iter != end; ++iter) { if(iter==last) {...} }
-
Braunstein schrieb:
Der Iterator auf das letzte Element ist dann end()-1
Nein ist er nicht.
Edit: Oder doch? Auf jeden Fall kann ich iter+1 usw nicht machen, was mich stört
Meine Frage nochmal, ist die Auflösung &*iter korrekt um die Adresse des foo Elements zu bekommen?
-
Seikilos schrieb:
Edit: Oder doch? Auf jeden Fall kann ich iter+1 usw nicht machen, was mich stört
Das liegt daran, dass + und - nur für Random Access definiert sind. List-Iteratoren sind aber nur Bidirektional, da funktioniert nur ++ und --.
Meine Frage nochmal, ist die Auflösung &*iter korrekt um die Adresse des foo Elements zu bekommen?
Solange Du die Sequenz nicht änderst, ist garantiert, dass die Adressen der Elemente fix bleiben. Du darfst dann also &*iter mit &foo.back() vergleichen, ja (Solange iter != end() und foo.size() > 0).
-
Hab es verstanden,
danke an euch beide