Ich habe vor kurzem gelernt, wie man mit umgekehrten Iteratoren in C++ richtig arbeitet (speziell wenn man einen löschen muss). (Siehe this question und this one.)Verwenden Sie einen regulären Iterator, um rückwärts zu iterieren, oder kämpfen Sie mit reverse_iterator?
Dies ist, wie man eigentlich, es zu tun:
typedef std::vector<int> IV;
for (IV::reverse_iterator rit = iv.rbegin(), rend = iv.rend();
rit != rend; ++rit)
{
// Use 'rit' if a reverse_iterator is good enough, e.g.,
*rit += 10;
// Use (rit + 1).base() if you need a regular iterator e.g.,
iv.erase((rit + 1).base());
}
Aber ich denke,
dachte, das viel besser ist (diese nicht tun, nicht Normen konform, wie MooingDuck weist darauf hin):
for (IV::iterator it = iv.end(), begin = iv.begin();
it-- != begin;)
{
// Use 'it' for anything you want
*it += 10;
iv.erase(it);
}
Nachteile:
-
Sie sagen mir. Was ist los damit? - Es ist nicht standardkonform, wie MooingDuck herausfindet. Das übersieht praktisch alle möglichen Vorteile unten.
Vorteile:
- Verwendet eine vertraute Idiom für Reverse-for-Schleifen
- Sie müssen sich nicht erinnern (oder zu erklären) die
+1
- Weniger
- Works für std eingeben: : list too:
it = il.erase(it);
- Wenn Sie ein Element löschen, müssen Sie den Iterator nicht anpassen
- Wenn Sie löschen, müssen Sie nicht den Iterator beginnen neu berechnen
Sie meinen neben der Tatsache, dass dies Undefined Behavior ist und in allgemeinen Situationen fehlschlagen/abstürzen wird? Probieren Sie es mit einer leeren 'map' aus. –
Pflege in einer Antwort zu erarbeiten? Verringert der UB einen Eingabe-Iterator oder dekrementiert er den Anfang? Ist es UB für alle Behälter? – Dan
Ich kann einen Eingabe- oder Ausgabe-Iterator nicht dekrementieren (ich habe das vergessen, gutes Auge), und Sie können auch nicht für irgendeinen Container über den Anfang hinaus dekrementieren. –