Im folgenden Code durchlaufe ich eine Karte und teste, ob ein Element gelöscht werden muss. Ist es sicher, das Element zu löschen und weiter zu iterieren, oder muss ich die Schlüssel in einem anderen Container sammeln und eine zweite Schleife ausführen, um erase () aufzurufen?
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 diese Frage gelesen, von der ich nicht dachte, dass sie verwandt wäre, aber ich beantworte meine Frage.
std::remove_if
nicht funktioniertstd:map
Antworten:
C ++ 11
Dies wurde in C ++ 11 behoben (oder das Löschen wurde verbessert / für alle Containertypen konsistent gemacht).
Die Löschmethode gibt jetzt den nächsten Iterator zurück.
C ++ 03
Durch das Löschen von Elementen in einer Karte werden keine Iteratoren ungültig.
(abgesehen von Iteratoren für das Element, das gelöscht wurde)
Das tatsächliche Einfügen oder Löschen macht keinen der Iteratoren ungültig:
Siehe auch diese Antwort:
Mark Ransom Technique
Sie müssen Ihren Code jedoch aktualisieren:
In Ihrem Code erhöhen Sie pm_it nach dem Aufruf von erase. Zu diesem Zeitpunkt ist es zu spät und ist bereits ungültig.
quelle
pm_it++
garantiert ausgeführt, bevor die Funktion eingegeben wird?Sequence
Containern. Die besondere Eigenschaft vonAssociative
Containern besteht darin, dass Iteratoren nicht durch Löschen oder Einfügen ungültig werden (es sei denn, sie zeigen auf ein Element, das gelöscht wurde). Vektor und Löschen usign Iteratoren wird ausführlich in der entsprechenden Frage stackoverflow.com/a/3938847/14065So mache ich das ...
quelle
So würde ich es ungefähr machen:
Es ist etwas Seltsames
aber ich habe es gerade aus Ihrem Beispielcode kopiert.
quelle