Heim >Backend-Entwicklung >C++ >Ist es sicher, „erase()' während der Iteration für ein C-Map-Element aufzurufen?

Ist es sicher, „erase()' während der Iteration für ein C-Map-Element aufzurufen?

Susan Sarandon
Susan SarandonOriginal
2024-12-11 15:21:14281Durchsuche

Is it Safe to Call `erase()` on a C   Map Element During Iteration?

Konsequenzen des Aufrufs von erase() für ein Kartenelement während der Iteration vom Anfang bis zum Ende

Beim Durchlaufen einer Karte in C müssen unbedingt die Auswirkungen berücksichtigt werden Aufrufen der erase()-Methode für ein Kartenelement innerhalb der Schleife. Konkret stellt sich die Frage: Ist es sicher, das Element zu löschen und mit der Iteration fortzufahren, oder ist es notwendig, die Schlüssel in einem anderen Container zu sammeln und eine separate Schleife zum Löschen durchzuführen?

In C 03 wird das Löschen von Elementen aus a Map macht keine Iteratoren ungültig, mit Ausnahme derjenigen, die auf das gelöschte Element verweisen. Es ist jedoch wichtig zu beachten, dass Ihr Code den Iterator nach dem Aufruf von erase ändert. Dies ist problematisch, da pm_it ungültig wird, sobald erase aufgerufen wird. Um dieses Problem zu beheben, sollten Sie den Iterator bevor erase aufrufen.

map<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 iterator and post-increment
    } else {
        ++pm_it;  // Can use pre-increment here for efficiency
    }
}

In C 11 wurde eine erhebliche Verbesserung beim Löschen vorgenommen, da nun der nächste Iterator zurückgegeben wird. Dadurch entfällt die Notwendigkeit der oben gezeigten umständlichen Post-Inkrement-Technik. Stattdessen können Sie schreiben:

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;
    }
}

Das obige ist der detaillierte Inhalt vonIst es sicher, „erase()' während der Iteration für ein C-Map-Element aufzurufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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