Lors d'une itération dans une std::list, supprimer des éléments tout en conservant un itérateur valide peut être difficile. Considérez le code suivant :
for (std::list<item*>::iterator i = items.begin(); i != items.end(); i++) { bool isActive = (*i)->update(); //if (!isActive) // items.remove(*i); //else other_code_involving(*i); } items.remove_if(CheckItemNotActive);
L'ajout des lignes commentées pour supprimer immédiatement les éléments inactifs entraînerait une erreur « Itérateur de liste non incrémentable ». En effet, la suppression d'un élément invalide l'itérateur.
Pour supprimer des éléments efficacement lors de l'itération, envisagez une approche en 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; } }
La clé ici consiste à incrémenter l'itérateur avant de supprimer l'élément. Alternativement, "i = items.erase(i)" peut être utilisé. Cela permet une suppression sûre et efficace des éléments lors de l'itération.
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!