Wie kann ich Elemente einer std :: map mit einem Iterator löschen?
Ich würde gerne eine Schleife über std::map
und löschen von Elementen basierend auf deren Inhalt. Wie am besten würde diese durchgeführt werden?
InformationsquelleAutor der Frage | 2011-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine C++11-kompatiblen compiler, hier ist eine einfache Möglichkeit, dies zu tun:
Die Idee ist es, zu Fuß den iterator vorwärts vom Beginn der container an das Ende, die überprüfung bei jedem Schritt, ob der aktuelle Schlüssel/Wert-paar gelöscht werden sollen. Wenn ja, entfernen wir das element der Iteration mit der
erase
member-Funktion, die liefert dann einen iterator auf das nächste element in der Karte. Ansonsten werden wir vorher die iterator-forward-Regel.Wenn Sie nicht über eine C++11-kompatiblen compiler, oder Sie arbeiten mit einer älteren Codebasis, die Dinge ein bisschen schwieriger. Vor C++11, die
erase
member-Funktion würde nicht zurück einen iterator auf das nächste element in der Karte. Dies bedeutete, dass, um zu entfernen Sie ein element solange Durchlaufen, würden Sie brauchen, um eine drei-Teil Tanz:erase
auf der Kopie der alten iterator.Dies ist hier gezeigt:
Dieser Prozess war notwendig, weil, wenn Sie gerade angerufen
erase
auf der iterator, Sie würde ungültigwas bedeutet, dass Operationen wie Inkrementieren und Dekrementieren würde führen zu undefiniertem Verhalten. Der obige code bekommt um diese durch eine Kopie der iterator, der fortschreitendenitr
so, dass es auf das nächste element, dann das löschen der temporären Kopie der iterator.Mit einigen Cleveren Trickiness, ist es möglich, verkleinern Sie diesen code unten auf Kosten der Lesbarkeit. Das folgende Muster ist Häufig in älteren C++ - code, aber nicht notwendig in C++11:
Den Einsatz der post-Inkrement-operator hier ist eine intelligente Möglichkeit, eine Kopie der alten iterator (denken Sie daran, dass eine postfix - ++ - operator gibt eine Kopie des original-iterator-Wert), während auch die Weiterentwicklung der älteren iterator.
InformationsquelleAutor der Antwort templatetypedef
Dies ist ein einfacher Weg:
InformationsquelleAutor der Antwort Chan
edit: scheint, dass diese Werke in MSVC nur
edit2: in c++0x dies funktioniert für assoziative Container zu
InformationsquelleAutor der Antwort Timo