Maison  >  Article  >  développement back-end  >  Erreur C++ : L'itérateur a expiré, comment le résoudre ?

Erreur C++ : L'itérateur a expiré, comment le résoudre ?

WBOY
WBOYoriginal
2023-08-22 17:37:471487parcourir

Erreur C++ : Litérateur a expiré, comment le résoudre ?

En programmation C++, l'utilisation d'un itérateur (Iterator) est un moyen courant de parcourir les éléments d'un conteneur. Cependant, lors de la traversée d'un conteneur, vous rencontrez parfois le problème de l'expiration de l'itérateur, provoquant le blocage du programme ou la production de résultats inattendus.

Alors, quel est le problème avec l'expiration de l'itérateur ? En termes simples, lorsque nous utilisons un itérateur pour parcourir un conteneur, si le conteneur est modifié (comme l'ajout ou la suppression d'éléments, etc.), cela peut rendre l'itérateur invalide, c'est-à-dire que l'élément pointé par l'itérateur n'est plus valide. n'existe plus ou si la position a été modifiée, une erreur se produira si l'itérateur est à nouveau utilisé.

Comment résoudre le problème de l'expiration de l'itérateur ? Voici quelques solutions courantes :

1. Utilisez la fonction d'effacement au lieu de la fonction de suppression

Lors de l'utilisation d'éléments conteneurs, les fonctions de suppression et d'effacement sont souvent utilisées. Ils peuvent tous deux être utilisés pour supprimer des éléments dans un conteneur. Cependant, la fonction de suppression déplace uniquement l'élément à supprimer vers la fin du conteneur et ne supprime pas réellement l'élément, tandis que la fonction d'effacement supprime réellement l'élément du conteneur. Par conséquent, si l'on souhaite supprimer des éléments lors du parcours du conteneur, il est préférable d'utiliser la fonction d'effacement afin de ne pas provoquer l'expiration de l'itérateur.

2. Utilisez le mot-clé auto

C++11 introduit le mot-clé auto, qui peut déduire automatiquement le type d'itérateur. Lors de l'utilisation du mot-clé auto, le compilateur fera automatiquement correspondre le type d'itérateur pour garantir que l'itérateur correspond au type du conteneur, évitant ainsi les problèmes d'incompatibilité de type.

Par exemple :

vector<int> v = {1,2,3,4,5};
for(auto it = v.begin(); it != v.end(); ++it){
    // ...
}

L'utilisation du mot-clé auto permet au compilateur de déduire automatiquement le type d'itérateur pour s'assurer qu'il correspond au type du conteneur.

3. Utilisez le bon itérateur lors de la modification du conteneur

Lorsque nous modifions le conteneur, nous devons nous assurer d'utiliser le bon itérateur. Par exemple, lors de la traversée d'un conteneur vectoriel, si vous souhaitez supprimer un élément, vous devez utiliser la fonction d'effacement, mais l'utilisation de la fonction d'effacement entraînera le changement des positions de tous les éléments après l'élément. Si nous utilisons toujours l'itérateur précédent pour pointer vers l'élément qui a été déplacé, l'itérateur deviendra invalide.

Pour éviter cette situation, nous pouvons d'abord enregistrer l'itérateur de la position de l'élément à supprimer avant d'effectuer l'opération de suppression, et mettre à jour l'itérateur avec la position après cet itérateur pour nous assurer que l'itérateur pointe toujours vers la bonne position. L'exemple de code est le suivant :

vector<int> v = {1,2,3,4,5};
auto it = v.begin() + 2; // 记录要删除的元素位置
v.erase(it); // 删除元素
it = v.begin() + 2; // 更新迭代器

Cela garantit que l'itérateur pointe toujours vers le bon emplacement et évite le problème d'échec de l'itérateur.

En bref, lors de l'écriture de programmes C++, utiliser des itérateurs pour parcourir des conteneurs est une opération très courante. Cependant, l'échec de l'itérateur est un problème très courant, nous devons donc faire attention à éviter ce problème afin de garantir l'exactitude du programme.

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