Maison >développement back-end >C++ >## Tous les itérateurs sont-ils invalides après `erase` sur un `std::vector` ?
Std::vector Invalidation de l'itérateur : invalidation de tous les itérateurs après l'effacement
Il est communément admis que l'effacement d'un élément d'un vecteur invalide uniquement les itérateurs pointant aux positions après l’élément effacé. Cependant, un problème clé se pose : l'itérateur à la position effacée est-il toujours valide ?
Selon la norme C, la réponse est non. Tous les itérateurs au niveau ou après le ou les itérateurs passés à effacer sont invalidés. Cela implique que le code suivant, qui vise à supprimer les entiers impairs d'un vecteur, entraînera un comportement indéfini :
<code class="cpp">typedef std::vector<int> vectype; vectype vec; // Initialize the vector for (int i = 0; i < 100; ++i) vec.push_back(i); vectype::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); // Invalidating iterator else ++it; }</code>
Gérer correctement l'itération
Pour gérer l'itération correctement après l'effacement, utilisez l'itérateur renvoyé par l'effacement. Cet itérateur pointe vers l'élément immédiatement après le ou les éléments effacés (ou vers la fin s'il n'y en a pas).
Dans ce cas, une approche plus efficace pour supprimer les entiers impairs serait d'utiliser l'effacement- supprimer l'expression :
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
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!