Maison > développement back-end > C++ > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-25 10:43:30
original
574 Les gens l'ont consulté

## 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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!