Maison >développement back-end >C++ >Comment itérer et supprimer en toute sécurité des éléments d'une liste std :: ?
Itérer et supprimer des éléments d'une std::list
Supprimer des éléments d'une std::list lors d'une itération nécessite une manipulation minutieuse pour évitez d’invalider l’itérateur. Une idée fausse courante consiste à supposer que la suppression d’un élément immédiatement après son évaluation incrémentera correctement l’itérateur. Cependant, cette approche conduit à l'erreur « Itérateur de liste non incrémentable ».
Comprendre le comportement de l'itérateur
Dans une std::list, les éléments sont alloués de manière contiguë. Lorsqu'un élément est supprimé, les éléments suivants se déplacent pour remplir l'espace libéré. Par conséquent, l’itérateur pointant initialement vers l’élément supprimé devient invalide. L'incrémentation de cet itérateur entraînera un comportement indéfini.
Approche correcte : incrémenter d'abord, supprimer plus tard
Pour supprimer correctement des éléments lors de l'itération, adoptez la stratégie suivante :
Code modifié à l'aide d'une boucle While :
std::list<item*>::iterator i = items.begin(); while (i != items.end()) { bool isActive = (*i)->update(); if (!isActive) { items.erase(i++); // alternatively, i = items.erase(i); } else { other_code_involving(*i); ++i; } }
Ce code modifié parcourt la liste et :
Éviter l'approche Remove_if
Votre code d'origine incluait un appel remove_if() après la boucle. Cette approche est généralement déconseillée dans ce contexte car elle nécessite un passage supplémentaire sur la liste. L'itération et la suppression en un seul passage, comme indiqué ci-dessus, sont une solution plus efficace et plus simple.
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!