Maison >développement back-end >C++ >Est-il sûr d'appeler « Erase() » sur un élément de carte C pendant l'itération ?
Lors de l'itération sur une carte en C , il est essentiel de considérer les implications de appeler la méthode Eraser() sur un élément de carte dans la boucle. Plus précisément, la question se pose : est-il sécuritaire d'effacer l'élément et de continuer l'itération, ou est-il nécessaire de collecter les clés dans un autre conteneur et d'effectuer une boucle séparée pour l'effacement ?
En C 03, effacer des éléments d'un map n'invalide aucun itérateur sauf ceux pointant vers l'élément qui a été supprimé. Cependant, il est crucial de noter que votre code modifie l'itérateur après avoir appelé effacer. Ceci est problématique car pm_it devient invalide une fois l'effacement appelé. Pour résoudre ce problème, vous devez incrémenter l'itérateur avant d'appeler effacer.
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 } }
En C 11, une amélioration significative a été apportée à l'effacement, car il renvoie désormais l'itérateur suivant. Cela élimine le besoin de la technique de post-incrémentation délicate présentée ci-dessus. Au lieu de cela, vous pouvez écrire :
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; } }
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!