In C kann das Durchlaufen einer Karte und das Löschen von Elementen Bedenken aufwerfen bezüglich der Iteratorvalidität. Das Verhalten variiert je nach verwendeter C-Version.
In C 11 wurde die erase()-Methode erweitert, um den Iterator zurückzugeben zum nachfolgenden Element. Dies vereinfacht den Prozess:
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; } }
In C 03 führt das Löschen von Elementen aus einer Karte nicht automatisch dazu, dass Iteratoren ungültig werden. Der Iterator, der auf das gelöschte Element zeigt, wird jedoch ungültig. Um die Gültigkeit des Iterators aufrechtzuerhalten, muss der Code aktualisiert werden:
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. Note the post increment } else { ++pm_it; } }
Hier wird der Post-Inkrement-Operator ( ) im erase()-Aufruf verwendet, um sicherzustellen, dass der zurückgegebene Iterator auf das richtige Element zeigt.
Das obige ist der detaillierte Inhalt vonWelche Auswirkungen hat das Entfernen von Kartenelementen während der Iteration in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!