Maison >développement back-end >C++ >## Tous les itérateurs sont-ils invalides après `erase` sur un `std::vector` ?

## Tous les itérateurs sont-ils invalides après `erase` sur un `std::vector` ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-25 10:43:30692parcourir

## Are All Iterators Invalid After `erase` on a `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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn