En C , parcourir une carte et effacer des éléments peut soulever des inquiétudes concernant la validité de l'itérateur. Le comportement varie en fonction de la version C utilisée.
En C 11, la méthode delete() a été améliorée pour renvoyer l'itérateur à l’élément suivant. Cela simplifie le processus :
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; } }
En C 03, l'effacement d'éléments d'une carte n'invalide pas automatiquement les itérateurs. Cependant, l'itérateur pointant vers l'élément supprimé devient invalide. Pour maintenir la validité de l'itérateur, le code doit être mis à jour :
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; } }
Ici, l'opérateur de post-incrémentation ( ) est utilisé dans l'appel d'effacement() pour garantir que l'itérateur renvoyé pointe vers le bon élément.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!