Container, bei dem die Adressen der Elemente sich nicht verändern



  • Hallo Leute,
    Ich brauch mal eure Hilfe bei einer Frage:
    Wenn ich einen std::vector als Container verwende, dann kann es ja sein, dass sich die Adressen der einzelnen Elemente ändern, zb:

    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    int *p=vec[2];
    vec.erase(vec.begin()+1);
    

    Meiner Erfahrung nach, zeigt p jetzt nicht mehr auf das letzte Element des Vektors. Verhält sich das bei allen Containern so, oder ist das bei list anders? Soweit ich weiss, besteht eine Liste ja aus einzelnen kleinen hmm ... Knoten, die nen Zeiger auf den Nachfolger und - bei ner doppelt verketteten - auf den Vorgänger gespeichert haben, was heisst, das man nciht das ganze Element im Speicher verschieben müsste, sondern nur den Zeiger umbiegen ... Stimmt das? Ist std::list für mein Vorhaben - Zeiger auf Elemente eines Containers zurückgeben, die auch noch gültig sind, nachdem ein Element davor eingefügt oder gelöscht wurde - der richtige Container?
    Danke im Voraus



  • Iteratoren bleiben auf jeden Fall gültig wenn du zum Beispiel erase benutzt, dementsprechend würde ich sagen, dass auch deine Zeiger gültig bleiben(sie sind ja nichts anderes)



  • sie bleiben aber nicht gültig 😞 hat mich schonmal mehrere stunden gekostet, weil ich das angenommen hab ...



  • deque:

    An erase in the middle of the deque invalidates all the iterators
    and references to elements of the deque. An erase at either end of
    the deque invalidates only the iterators and the references to the
    erased elements.

    list:

    Invalidates only the iterators and references to the erased ele-
    ments.

    vector:

    Invalidates all the iterators and references after the point of the
    erase.

    (es geht jeweils um die erase Memberfunktionen)



  • also list?



  • Original erstellt von KPC:
    Iteratoren bleiben auf jeden Fall gültig wenn du zum Beispiel erase benutzt, dementsprechend würde ich sagen, dass auch deine Zeiger gültig bleiben(sie sind ja nichts anderes)

    Iteratoren sind schon was anderes als Zeiger. Sie erfüllen aber im Prinzip den selben Zweck.


Anmelden zum Antworten