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'objectif est de supprimer les éléments inactifs de la liste immédiatement après leur mise à jour, évitant ainsi la nécessité d'un deuxième passage. Cependant, tenter de supprimer des éléments dans la boucle à l'aide des lignes commentées entraîne l'erreur "Itérateur de liste non incrémentable."
La clé pour supprimer en toute sécurité des éléments pendant l'itération est de suivre les séquence correcte des opérations. Au lieu de l'approche de boucle for présentée ci-dessus, le code doit être modifié en boucle while comme démontré ci-dessous :
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; } }
En incrémentant d'abord l'itérateur (i ), l'itérateur reste valide et peut être utilisé pour supprimer l'élément inactif.
Dans la boucle for d'origine, tentative de suppression d'un élément en utilisant items.remove(*i) dans la boucle body a invalidé l’itérateur (i), provoquant l’échec de l’itération suivante. La boucle while garantit que l'itérateur est mis à jour avant que l'élément ne soit supprimé, garantissant ainsi sa validité pour l'itération suivante. En utilisant items.erase(i ) ou i = items.erase(i), l'élément approprié est supprimé de la liste et l'itérateur est automatiquement mis à jour pour pointer vers le prochain élément valide.
Cette approche permet pour la suppression efficace des éléments inactifs pendant l'itération sans avoir besoin d'un passage séparé dans la liste.
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!