2009-04-17 12 views
11

Ich plane, eine Liste von Dingen in C++ zu implementieren, in der Elemente möglicherweise außer Betrieb genommen werden. Ich erwarte nicht, dass ich irgendeine Art von Zufallszugriff benötige (ich muss nur die Liste regelmäßig fegen), und die Reihenfolge der Elemente ist auch nicht wichtig.Was ist die Lebensdauer und Gültigkeit von C++ Iteratoren?

Also dachte ich an std::list<Thing*> with this->position = insert(lst.end(), thing) sollte den Trick tun. Ich möchte, dass sich die Thing-Klasse an die Position der einzelnen Instanzen erinnert, so dass ich später problemlos in konstanter Zeit lst.erase(this->position) tun kann.

Allerdings bin ich noch ein wenig neu in C++ - STL-Container, und ich weiß nicht, ob es sicher ist, Iteratoren für so lange Zeit zu halten. Vor allem, da vor und nach dem eingefügten Ding noch weitere Elemente gelöscht werden, bevor es weg ist.

Antwort

13

In der Liste bleiben alle Iteratoren während des Einfügens gültig und nur Iteratoren zu gelöschten Elementen werden beim Löschen ungültig.

In Ihrem Fall sollte der Iterator in Ordnung bleiben, auch wenn andere Elemente vor und nach dem eingefügten Thing * gelöscht werden.

EDIT:

Zusätzliche Details für Vektor- und deque:

Vektor:

  • Einfügen --- Alle Iteratoren erhalten ungültig, wenn Neuzuteilung geschieht, seine ansonsten geltenden .
  • löschen ---- Alle Iteratoren nach Löschpunkt werden ungültig.

deque:

  • Einfügen --- Alle Iteratoren erhalten ungültig.
  • löschen ---- Alle Iteratoren erhalten ungültig.
+0

Gute Antwort, es würde auch helfen zu wissen, welche Gründe eine Vektorumleitung verursachen könnte. (Das Einfügen eines Elements ist das Offensichtliche, aber gibt es andere?) – Malabarba

+0

Jede Änderung des Vektors (sowohl Einfügen als auch Entfernen) erlaubt es, Iteratoren neu zuzuordnen und ungültig zu machen; ob dies der Fall ist oder nicht, ist implementationsdefiniert. Sie gehen also davon aus, dass das Ändern eines Vektors in irgendeiner Weise alle vorhandenen Iteratoren ungültig macht. – Miral

3

Das hängt von dem Container ab, den Sie verwenden.

Check: http://www.sgi.com/tech/stl/
Schauen Sie sich jeder Container Dokumentation am Ende ihrer wird eine Beschreibung über die Bedingungen, die Iteratoren bleiben gültig unter.

Für std :: list <> bleiben sie unter allen Bedingungen gültig, bis das Element, auf das sie sich beziehen, aus dem Container entfernt wird (zu diesem Zeitpunkt sind sie ungültig).

+0

danke für die Info. Ich benutzte bereits die Dokumentation von SGI, aber ich glaube, ich habe die Notizen übersehen und nicht bemerkt, dass die Antwort da war. – PypeBros

Verwandte Themen