2009-04-17 9 views
11

Je prévois d'implémenter une liste de choses en C++ où les éléments pourraient être supprimés dans le désordre. Je ne pense pas que j'aurai besoin d'un quelconque accès aléatoire (j'ai juste besoin de balayer la liste périodiquement), et l'ordre des éléments n'est pas important non plus. J'ai pensé à std::list<Thing*> with this->position = insert(lst.end(), thing) devrait faire l'affaire. Je voudrais que la classe Chose se souvienne de la position de chaque instance afin que je puisse facilement faire plus tard lst.erase(this->position) en temps constant.Quelle est la durée de vie et la validité des itérateurs C++?

Cependant, je suis encore un peu nouveau pour C + les conteneurs STL, et je ne sais pas s'il est sûr de garder itérateurs pour si longtemps. Surtout, étant donné qu'il y aura d'autres éléments supprimés avant et après la chose insérée avant qu'il ne soit parti.

Répondre

13

Dans la liste tous les itérateurs demeurent valides durant l'insertion et seulement itérateurs aux éléments effacés deviennent invalides pendant l'effacement.

Dans votre cas, en gardant iterator devrait être bien même lorsque d'autres éléments supprimés avant et après la chose insérée *.

EDIT:

détails supplémentaires pour vecteur et deque:

Vector:

  • --- Tous encartage itérateurs obtenir invalide si la réaffectation se produit, sinon sa validité .
  • effacer ---- Toutes les itérateurs après point d'effacement se invalide.

deque:

  • insertion --- Tous les itérateurs se invalide. Effacement ---- Tous les itérateurs obtiennent invalide
+0

Bonne réponse, il serait également utile de savoir quelles raisons pourraient provoquer un vecteur de réaffecter. (l'insertion d'un élément est la plus évidente, mais y en a-t-il d'autres?) – Malabarba

+0

Toute modification du vecteur (insertion et suppression) est autorisée à réallouer et invalider les itérateurs; que l'on le fasse ou non est défini par l'implémentation. Il est donc préférable de supposer que modifier un vecteur invalide toujours tous les itérateurs existants. – Miral

3

Cela dépend du récipient que vous utilisez. Regardez la documentation de chaque conteneur à la fin de leur description des conditions de validité des itérateurs. Pour std :: list <> ils restent valables dans toutes les conditions jusqu'à ce que l'élément auquel ils se réfèrent soit retiré du conteneur (à ce stade, ils ne sont pas valides).

+0

merci pour l'info. J'utilisais déjà la documentation de SGI, mais je suppose que j'ai oublié les notes et n'ai pas remarqué que la réponse était là. – PypeBros

Questions connexes