Maison  >  Article  >  développement back-end  >  ## Les itérateurs pour les éléments effacés dans un `std::vector` sont-ils toujours valides ?

## Les itérateurs pour les éléments effacés dans un `std::vector` sont-ils toujours valides ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 18:03:02329parcourir

## Are Iterators to Erased Elements in a `std::vector` Still Valid?

Std::vector Invalidation des itérateurs : découvrir la validité des itérateurs après effacement

Dans le domaine de C, les subtilités des itérateurs vectoriels et leur comportement après les effacements peut être source de confusion. Pour approfondir ce problème, nous explorerons un scénario spécifique :

Validation de la persistance d'un itérateur après une opération d'effacement

Des questions pertinentes se posent concernant la validité d'un itérateur pointant directement à l'élément effacé dans un std::vector. L'idée dominante est que les itérateurs pointant vers des positions après l'élément effacé sont invalidés. Cependant, la question demeure : l'itérateur pointant vers l'emplacement exact de l'élément effacé est-il toujours valide ?

Analyse et exemple

Pour faire la lumière sur cette question, considérons l'extrait de code suivant, qui tente d'éliminer tous les entiers impairs d'un vecteur :

<code class="cpp">vector<int> vec;

for (int i = 0; i < 100; ++i) vec.push_back(i);

vector<int>::iterator it = vec.begin();
while (it != vec.end()) {
    if (*it % 2 == 1) vec.erase(it);
    else ++it;
}</code>

Bien que ce code puisse sembler fonctionner correctement, il est crucial d'approfondir pour déterminer sa validité.

Répondre à la question

La réponse indique sans équivoque l'invalidation non seulement des itérateurs pointant vers des positions après l'élément effacé, mais également de l'itérateur pointant vers l'emplacement exact de cet élément.

Cependant, l'effacement d'un élément fournit un itérateur renvoyé pointant immédiatement après le ou les éléments supprimés ou vers la fin s'il n'en reste aucun. Cela permet une poursuite transparente de l'itération.

Élimination efficace des éléments impairs

Il convient de noter que l'extrait de code présenté n'est pas la méthode la plus efficace pour supprimer les éléments impairs. Une approche nettement plus efficace implique l’idiome effacer-supprimer, qui utilise un prédicat personnalisé pour localiser et identifier les éléments à supprimer. Par exemple, nous pouvons définir un prédicat appelé is_odd et l'utiliser avec Remove_if et Eraser :

<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>

Cela élimine le mouvement coûteux des éléments, réduisant la complexité temporelle à O(n).

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