Maison > développement back-end > C++ > Pourquoi l'effacement d'éléments vectoriels avec un itérateur plante-t-il sans vérification conditionnelle spécifique ?

Pourquoi l'effacement d'éléments vectoriels avec un itérateur plante-t-il sans vérification conditionnelle spécifique ?

Mary-Kate Olsen
Libérer: 2024-12-07 12:25:13
original
987 Les gens l'ont consulté

Why Does Erasing Vector Elements with an Iterator Crash Without a Specific Conditional Check?

Pourquoi le code « Vector Erase Iterator » plante-t-il sans vérification conditionnelle supplémentaire ?

Considérez le code suivant :

vector<int> res;
res.push_back(1);
vector<int>::iterator it = res.begin();
for( ; it != res.end(); it++)
{
    it = res.erase(it);
}
Copier après la connexion

Ce code tente d'effacer tous les éléments d'un vecteur à l'aide d'un itérateur. Cependant, il plante sans la vérification conditionnelle supplémentaire suivante :

if(it == res.end())
    return 0;
Copier après la connexion

Explication

La fonction d'effacement renvoie un itérateur pointant vers l'élément suivant après l'élément effacé. Lorsque le dernier élément est effacé, l'itérateur renvoyé est égal à res.end().

Dans le code d'origine, sans la vérification conditionnelle, la boucle for continue d'incrémenter l'itérateur même après avoir atteint la fin de l'itérateur. vecteur. Cela se traduit par une tentative d'accès à la mémoire au-delà des limites du vecteur, conduisant à un crash.

En utilisant la vérification conditionnelle, la boucle se termine lorsque l'itérateur atteint la fin du vecteur (it == res. fin()). Cela évite le crash.

Structure de boucle alternative

Pour éviter d'avoir besoin de la vérification conditionnelle, vous pouvez réécrire la boucle comme suit :

while (it != res.end())
{
    it = res.erase(it);
}
Copier après la connexion

Cette boucle se terminera automatiquement lorsqu'elle atteindra res.end(), car la condition ne sera plus valable true.

Considérations supplémentaires

Lors de l'effacement conditionnel d'éléments, il est nécessaire d'incrémenter l'itérateur manuellement si l'élément n'est pas effacé. Ceci peut être réalisé en utilisant :

for ( ; it != res.end(); )
{
   if (condition) 
        it = res.erase(it);
   else 
        ++it;
}
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