std::set rückwärts durchgehen
-
Hallo,
Ich möchte in einem std::set alle Elemente von Hinten nach vorne durchgehen.
Anders herum ist es ja einfach, aber wie kann ich das am besten umkehren?folgendes hat nicht funktioniert:
std::set<Elem*> Stapel; for(std::set<Elem*>::iterator i = (Stapel.end()--); i != (Stapel.begin()--); i--) { (*Stapel)->Func(); }Es gibt einen Laufzeitfehler, das der iterator nicht dereferenzierbar sei.
-
std::set<Elem*> Stapel; for(std::set<Elem*>::reverse_iterator i = Stabel.rbegin(); i != Stabel.rend(); ++i) { (*Stapel)->Func(); }
-
Stapel.begin()--ist nicht definiert, du kannst einen Iterator auf begin() nicht dekrementieren, genausowenig kann man ein Iterator auf end() nicht inkrementieren. Was du suchst sind rbegin() und rend(). Sollte sich aber auch im Buch/Tutorial deiner Wahl nachlesen lassen.
-
Mr X schrieb:
Hallo,
Ich möchte in einem std::set alle Elemente von Hinten nach vorne durchgehen.
Anders herum ist es ja einfach, aber wie kann ich das am besten umkehren?Ich würde im ersten Moment auf folgendes tippen:
std::set<Elem*> Stapel; for(std::set<Elem*>::iterator i = Stapel.rbegin(), end = Stapel.rend(); i != end; ++i) (*Stapel)->Func();
-
Danke für die schnelle, zahlreiche Hilfe!
Gibt es einen Unterschied zwischen den Lösungen mit reverse_iterator und iterator, bspw. in der Geschwindigkeit, oder ist das lediglich ein "kosmetischer" Unterschied?
-
ohne reverse_iterator:
std::set<Elem*> Stapel; for(std::set<Elem*>::iterator i = Stapel.end(); i != Stapel.begin(); ) (*--i)->Func();Das entsteht einfach dadurch, dass wir eine normale Schleife begin->end rückwärts durchlaufen, dabei ist natürlich auch die Reihenfolge im Schleifenkörper umzukehren. Das Inkrementieren des Iterators ist typischerweise die letzte Operation, folglich muss das Dekrementieren hier als erstes durchgeführt werden.
Nebenbei gessagt, sind Ausdrücke wie Stapel.end()-- nicht standardkonform.
-
Mr X schrieb:
Danke für die schnelle, zahlreiche Hilfe!
Gibt es einen Unterschied zwischen den Lösungen mit reverse_iterator und iterator, bspw. in der Geschwindigkeit, oder ist das lediglich ein "kosmetischer" Unterschied?
Ein reverse_iterator ist theoretisch etwas langsamer als ein normaler iterator. Es sei denn, der Compiler kann das aliasing-Problem lösen, dann gibt es keinen Unterschied.