"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > ## **Les itérateurs renvoyés par `std::vector::erase` pointent-ils vers des éléments valides après la suppression ?**

## **Les itérateurs renvoyés par `std::vector::erase` pointent-ils vers des éléments valides après la suppression ?**

Publié le 2024-11-09
Parcourir:493

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

Invalidation des itérateurs std::vector : une explication détaillée

Le concept d'invalidation d'itérateur dans std::vector a été fréquemment discuté. Pour clarifier, l'effacement des éléments vectoriels via std::vector::erase invalide les itérateurs positionnés strictement après l'élément effacé.

Cependant, la validité de l'itérateur à la position exacte de l'élément effacé reste incertaine. Logiquement, on pourrait supposer que cet itérateur reste valide puisque l'implémentation sous-jacente du vecteur décale généralement les éléments restants pour remplir l'espace vide. Cependant, le comportement précis et le potentiel de résultats indéfinis sont moins certains.

Considérez l'exemple suivant, qui illustre la suppression d'entiers impairs d'un vecteur :

typedef std::vector vectype;
vectype vec;

for (int i = 0; i 

Bien que ce code semble s'exécuter sans erreurs en pratique, sa validité reste discutable.

La réponse réside dans le comportement d'effacement : il invalide en effet tous les itérateurs au niveau ou après l'itérateur ( s) passé à effacer. Cependant, il renvoie également un nouvel itérateur immédiatement après le ou les éléments effacés ou à la fin si un tel élément n'existe pas. Cet itérateur peut être utilisé pour reprendre l'itération.

Il est important de noter que la méthode ci-dessus de suppression des entiers impairs est inefficace (O(n2)) car chaque effacement nécessite un décalage de tous éléments ultérieurs. L'idiome effacer-supprimer offre une solution beaucoup plus efficace (O(n)) :

bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3