eine frage zu iteratoren



  • also, ich erstelle mir grad einen satz von containern(vielleicht mehr dazu später), und bin grad bei den iteratoren angelangt, ich hab zwar die ganze zeit sgi.com und die bcb hilfe aufm desktop, aber eine frage konnte mir nicht beantwortet werden(oder mein englisch ist einfach zu miserabel *hust* *hust* :D)

    die frage wäre folgende:
    Muss sich ein Iterator(speziell die random-access-iteratoren) darauf einstellen können, dass sein Container sich ändert?



  • In der STL ist das glaub ich nicht so . Kommt darauf an, wie sicher du deinen Container machen willst. 😉
    In Java werden Iteratoren ungültig, wenn sich der Container ändert. Kann man glaub ich recht leicht programmieren, würde ich also für die Debug-Version schon machen.



  • das war genau die Antwort, die ich hören wollte 😉
    erleichtert mir das Programmieren ungemein 😃



  • Bei Änderungen des Containers können Iteratoren ungültig werden. Dazu gibts Beispiele in den Büchern von Scott Meyers und Herb Sutter. Also Vorsicht !!



  • das is mir klar 🙄, deshalb hab ich ja gefragt



  • Die Iteratoren werden aber nicht immer alle ungültig. In der Doku auf sgi.com findest du dazu für gewöhnlich Hinweise in der Beschreibung zu den Containern, z.B. beim vector

    [5] A vector's iterators are invalidated when its memory is reallocated. Additionally, inserting or deleting an element in the middle of a vector invalidates all iterators that point to elements following the insertion or deletion point. It follows that you can prevent a vector's iterators from being invalidated if you use reserve() to preallocate as much memory as the vector will ever use, and if all insertions and deletions are at the vector's end.

    Zusätzlich könntest du mal einen Blick auf STLPort.com werfen. Die Hilfen in dieser Implementierung (z.B. automatische Erkennung ungültiger Iteratoren in der Debug-Version) sind nahezu unentbehrlich 😉



  • Naja, iteratoren sind von ihrem Design (Pattern) her schonmal eher temporaere objekte. Also solltest prinzipiell davon ausgehen das die kaputt gehen, wenn der Container sich in irgend einer Form aendert. Das hat nicht nur mit der STL was zu tun ...
    Also iteratoren nie Speichern ... dann lieber die Liste/oder was auch immer, indizieren .....

    Nen Iterator der sich "meldet", wenn beim Object worauf er zugreift sich was aendert, ist kein iterator mehr 😃

    Ciao ...



  • sorry erstmal, dass ich den thread nochmal hochhol...

    ich hab nämlich noch ne erweiternde frage:

    nehmen wir mal an, ich habe 2 random access iteratoren a und b.

    a gehört zum vector a1
    und b zum vector b1

    was passiert, wenn ich jetzt a>b machen will?


Anmelden zum Antworten