Ich habe eine Situation, wo ich durch einen Vektor marschieren, Dinge zu tun:Was ist der sauberste Weg, um einen std :: vector mit Iteratoren zu bearbeiten?
std::vector::iterator iter = my_list.begin(); for (; iter != my_list.end(); ++iter) { if (iter->doStuff()) // returns true if successful, false o/w { // Keep going... } else { for (; iter != m_list.begin(); --iter) // ...This won't work... { iter->undoStuff(); } } }
Unter normalen Bedingungen - alles unter der Annahme gut geht - ich die ganzen Weg zu my_list.end()
marschieren und die Schleife erfolgreich zu beenden.
Wenn jedoch etwas schief geht, während ich Sachen mache, möchte ich alles rückgängig machen können - im Grunde genommen meine Schritte bis zum Anfang des Vektors zurückverfolgen und alles nacheinander in umgekehrter Reihenfolge rückgängig machen.
Mein Problem ist, dass, wenn ich zu my_list.begin()
- wie in der verschachtelten for-Schleife gezeigt - ich bin wirklich noch nicht fertig, weil ich immer noch undoStuff()
auf meinem ersten Element in der Liste aufrufen muss. Jetzt könnte ich den letzten Anruf außerhalb der Schleife machen, aber das scheint ein wenig unrein zu sein.
So wie ich es sehe, bin ich erst fertig, wenn ich zu my_list.rend()
komme. Ich kann jedoch einen std :: vector :: iterator nicht mit einem std :: vector :: reverse_iterator vergleichen.
Gegeben, was ich versuche zu tun, was ist die beste Wahl von Iterator-Typ/Loop-Kombination?
Eine einfache Denkweise über Iteratoren ist, dass sie Cursor an Positionen zwischen Elementen sind. Ein Vorwärts-Iterator wird das Element nach dem Cursor erzeugen, wenn dereferenziert wird, ein Rückwärts-Iterator wird das Element vor dem Cursor erzeugen, wenn dereferenziert wird. Äquivalente Vorwärts- und Rückwärts-Iteratoren sind Cursor, die sich an der gleichen Position befinden. – Mankarse