Was passiert, wenn Sie während eines Iterationsvorgangs von Anfang bis Ende auf ein Kartenelement löschen () aufrufen?
In der folgende code, den ich in einer Schleife durch eine Karte und testen, ob ein element gelöscht werden muss,. Ist es sicher zu löschen Sie das element und halten Durchlaufen oder muss ich die sammeln Sie die Schlüssel in einem anderen Behälter, und eine zweite Schleife zum aufrufen der löschen()?
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it;
for (pm_it = port_map.begin(); pm_it != port_map.end(); pm_it++)
{
if (pm_it->second == delete_this_id) {
port_map.erase(pm_it->first);
}
}
UPDATE: natürlich habe ich dann Lesen Sie diese Frage was ich nicht glaube, wäre im Zusammenhang, aber beantwortet meine Frage.
InformationsquelleAutor der Frage MattSmith | 2008-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++11
Dies wurde behoben in C++11 (oder löschen wurde verbessert/gemacht konsistent über alle container-Typen).
Die erase-Methode gibt nun den nächsten iterator.
C++03
Löschen von Elementen in einer Karte nicht ungültig alle Iteratoren.
(abgesehen von Iteratoren auf das element, das gelöscht wurde)
Eigentlich einfügen oder löschen nicht ungültig alle Iteratoren:
Siehe auch diese Antwort:
Mark Lösegeld Technik
Aber Sie müssen aktualisieren Sie Ihren code:
In Ihrem code, den Sie Inkrementieren pm_it nach Aufruf löschen. An diesem Punkt ist es zu spät und ist bereits entwertet.
InformationsquelleAutor der Antwort Martin York
Hier, wie ich das machen soll ...
InformationsquelleAutor der Antwort AlaaShaker
Dies ist, wie ich es tun würde, etwa:
Es ist etwas seltsam über
aber ich habe gerade kopiert es aus deinem Beispiel-code.
InformationsquelleAutor der Antwort ravenspoint