carte/jeu de itérateur pas incrementablemap/set itérateur pas incrementable
Driver::~Driver()
{
AutoCritSec acsDriverList(m_csDriverList,true);
DRIVERLIST::iterator it = m_DriverList.begin();
for(;it!=m_DriverList.end();it++)
{
if (it->second == this)
{
m_DriverList.erase(it);
it = m_DriverList.begin();
}
}
}
Quand je compile mon programme dans visual studio 2003, mon programme se comporte de bien et de bon. mais quand je fais la même chose en 2010, puis lors de la fermeture de l'application, j'obtiens une erreur comme
Expression:map/set iterator not incrementable
et lorsque j'appuie sur l'ignorer-je obtenir
Expression:"standard c++ library out of range" && 0
Quelqu'un a une idée de ce qui se passe ici: je vais très endettés pour des suggestions par personne. Des tonnes de remerciements et vœux les plus chaleureux.
OriginalL'auteur user1107855 | 2012-01-25
Vous devez vous connecter pour publier un commentaire.
Si
this
est le seul élément dans la liste, vous sera dépassé à la fin de la liste.Après la suppression de
this
à partir de la liste, vous pouvez réinitialiserit = m_DriverList.begin();
. C'est très bien. Puis la boucle expression est évaluée (lei++
de lafor
déclaration), ce qui provoqueit
être avancé au delà de la fin de la gamme.La promotion d'un itérateur passé à la fin du conteneur, le programme présentent un comportement indéfini. Les dernières versions de Visual C++ en aidant à détecter de nombreuses communes itérateur erreurs dans les versions de débogage de votre programme et de soulever des affirmations pour vous aider à les résoudre.
Vous pouvez résoudre le problème en supprimant la boucle d'expression et en la déplaçant dans un
else
déclaration:Cependant, le redémarrage de l'itération à chaque fois que vous supprimez un élément est plutôt gourmande. Envisager d'utiliser l'aide de l'itérateur renvoyé par l'appel à
erase
:Si le conteneur est une carte (question du titre, l'accès au membre de
second
) alors je ne pense pas que le supprimer-supprimer idiome peut être appliquée. Le idiomatiques est similaire à la boucle while que vous avez, mais au lieu de redémarrer l'itération de copier et avance l'itérateur et ensuite effacer la position actuelle.Bonne prise; j'ai été distrait par "Liste" dans le nom de la variable. En C++11,
erase
renvoie l'itérateur sur l'élément suivant (ou à un passé la fin si il n'y a aucun élément suivant), et Visual C++ 2010 prend en charge cette.oui, c'était manquant à partir de c++03, où la fonction d'effacement est revenu le lendemain itérateur uniquement pour les séquences, mais pas pour les conteneurs associatifs. Pour les conteneurs associatifs que le travail doit être fait manuellement en C++03
OriginalL'auteur James McNellis
La bonne effacer idiome pour les conteneurs associatifs est comme suit:
OriginalL'auteur Kerrek SB