Heim > Backend-Entwicklung > C++ > Wie lösche ich Kartenelemente beim Iterieren in C sicher?

Wie lösche ich Kartenelemente beim Iterieren in C sicher?

DDD
Freigeben: 2024-12-22 21:22:11
Original
903 Leute haben es durchsucht

How to Safely Erase Map Elements While Iterating in C  ?

Potenzielle Fallstricke beim Löschen von Kartenelementen während der Iteration

Beim Bearbeiten von Karten in C ist es wichtig, die Konsequenzen des Löschens von Elementen während der Iteration zu berücksichtigen ihnen. Diese Frage untersucht die potenziellen Probleme und bietet Lösungen für C 03 und C 11.

Überlegungen zu C 03

In C 03 ist das Löschen eines Elements aus einer Karte nicht möglich Alle Iteratoren in der Karte werden automatisch ungültig gemacht. Allerdings wird dadurch der Iterator ungültig, der auf das gelöschte Element verweist. Um eine Map sicher zu durchlaufen und Elemente während der Iteration zu löschen, müssen Sie den Iterator erhöhen, bevor Sie erase aufrufen. Hier ist eine aktualisierte Version des in der Frage bereitgestellten Codes:

map<string, SerialdMsg::SerialFunction_t><string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        port_map.erase(pm_it++);  // Use post-increment to get the updated iterator.
    } else {
        ++pm_it;  // Can use pre-increment for efficiency.
    }
}
Nach dem Login kopieren

C 11-Verbesserungen

In C 11 wurde die Methode erase() erheblich verbessert. Es gibt jetzt einen Iterator zurück, der auf das nächste Element in der Karte zeigt, wodurch es sicher ist, Elemente während der Iteration zu löschen, ohne andere Iteratoren ungültig zu machen. Der aktualisierte Code mit C 11 wäre:

auto pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        pm_it = port_map.erase(pm_it);
    } else {
        ++pm_it;
    }
}
Nach dem Login kopieren

Mark Ransom Technique

Die Mark Ransom Technique ist eine weitere Option in C 03 zum sicheren Löschen von Kartenelementen während der Iteration . Dabei wird ein temporärer Vektor erstellt, um die Schlüssel der zu löschenden Elemente zu speichern und diese dann in einer zweiten Schleife zu löschen.

Zusammenfassend lässt sich sagen, dass beim Löschen von Elementen aus einer Karte während der Iteration in C das Potenzial berücksichtigt werden muss Machen Sie Iteratoren ungültig und verwenden Sie je nach verwendeter C-Version den entsprechenden Ansatz. Denken Sie daran, den Iterator immer zu erhöhen, bevor Sie ein Element löschen, um die Konsistenz zu wahren und unerwartetes Verhalten zu vermeiden.

Das obige ist der detaillierte Inhalt vonWie lösche ich Kartenelemente beim Iterieren in C sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage