L'aide d'un Ensemble d'Itérateur en C++
Lorsque j'essaie d'utiliser un ensemble d'itérateur en mode debug en C++, j'obtiens un message d'erreur qui dit "carte/jeu de itérateur pas dereferencable". Je ne comprends pas parce que je pensais que dereferincing était la façon dont vous êtes censé utiliser un itérateur. Le code ressemble à ceci:
set<int>::iterator myIterator;
for(myIterator = mySet.begin();
myIterator != mySet.end();
myIterator++)
DoSomething(*myIterator)
Qui est le format de tous les exemples que j'ai vu en ligne sur la façon d'utiliser les itérateurs. Ce que je fais mal?
Ce qui est DoSomething déclarée?
Cet exemple semble plausible correcte (à moins d'un manque
Est-il un moment de la compilation ou de l'exécution d'erreur?
Alors qu'il probablement ne pas faire une différence dans ce cas, vous pourriez obtenir de meilleures performances avec:
Au lieu de montrer ce que le code "ressemble", nous montrer ce que le code est en réalité. Aussi, il est préférable d'utiliser les pré-incrémentation, plutôt que de la post-incrémentation sur les itérateurs, en raison de la post-incrémentation nécessitant la création d'un inutile temporaire.
Cet exemple semble plausible correcte (à moins d'un manque
;
). Vous avez besoin de poster quelque chose de plus complet qui, de fait, expose le problème que vous rencontrez. Comment est mySet
rempli, par exemple?Est-il un moment de la compilation ou de l'exécution d'erreur?
Alors qu'il probablement ne pas faire une différence dans ce cas, vous pourriez obtenir de meilleures performances avec:
++myIterator
. Le suffixe de l'opérateur nécessite de faire une copie de l'itérateur.Au lieu de montrer ce que le code "ressemble", nous montrer ce que le code est en réalité. Aussi, il est préférable d'utiliser les pré-incrémentation, plutôt que de la post-incrémentation sur les itérateurs, en raison de la post-incrémentation nécessitant la création d'un inutile temporaire.
OriginalL'auteur Alex319 | 2009-12-14
Vous devez vous connecter pour publier un commentaire.
Si
DoSomething()
modifie le jeu - supprime ou insère des éléments, puis l'itérateur vous tenez est invalidée, ce qui sera probablement la cause de cette erreur.std::set
itérateur est invalidé uniquement si l'élément auquel il se réfère est retiré de l'ensemble: vous pouvez insérer n'importe quel élément, et de supprimer n'importe quel élément, mais un seul. Voir 23.1.2/8.OriginalL'auteur shoosh
La première et la plus grande chose que vous faites mal, c'est l'écriture de code comme ceci à tous. Ce que vous avez ci-dessus est de la main-équivalent écrit:
Il y a relativement peu de vraiment bons usages de itérateurs en dehors de la mise en œuvre des algorithmes. Une fois qu'il est raisonnable avec une carte ou multimap (ou unordered_[multi]carte), mais c'est surtout pour compenser map et multimap en utilisant std::pair, ce qui n'est pas tout à fait merveilleux.
unary_compose
, avec une fonction qui associe à une paire à sa première ou sa deuxième élément.OriginalL'auteur Jerry Coffin
Cette erreur signifie généralement vous accédez à une "fin()" itérateur.
Platine: Le code en question n'est pas ce qu'il est en cours d'exécution, c'est juste son impression ("ressemble").
OriginalL'auteur Sanjaya R
Cette question est basée sur une fausse prémisse. J'ai vu le message d'erreur "carte/jeu de itérateur pas dereferencable" et estime que c'est un énoncé général qui s'appliquent à tous de la carte/jeu de itérateurs, qui, comme je l'ai dit, n'aurait aucun sens. Mais j'ai regardé de nouveau et le vrai problème était juste que le pointeur j'ai été l'aide à l'accès que l'itérateur n'était pas valide.
OriginalL'auteur Alex319