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 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); }
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;
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); }
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; }
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!