bestimmtes Element in std::vector löschen



  • Braunstein schrieb:

    Meint ihr das aus 23.2.4 1

    ... Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

    Exakt. Das heisst auch muffmolchs Indexoperator funktioniert hinreichend korrekt 😉



  • Wenn man das mit 23.2.4.3 zusammenbringt steht eigentlich fest, dass den Bibliotheksherstellern gar nichts anderes übrig bleibt, als nach erase zu kopieren und dann end und size anzupassen. Evtl. vorher erzeugte Iteratoren gelten dann natürlich nicht mehr für den Bereich ab dem gelöschten Element.



  • Mal zum remove:
    Wenn die Funktionalität von remove "implementation defined" ist, dann würde das doch bedeuten, dass man damit rechnen muss, dass die Objekte einfach mit 0 überschrieben werden, oder? Wenn das Objekt aber kein POD ist, sondern selbst speicher verwaltet, dann würde der Zeiger darauf doch durch das Überschreiben verloren gehen?

    Noch schlimmer: wenn man danach vector::erase aurufen würde, würde nachträglich auf diesen kaputten Objekten der dtor aufgerufen(ist schätzungsweise wohl auch implementation defined, hab grad den standard net da).

    Ist es unter diesen voraussetzungen überhaupt sinnvoll, remove zu verwenden?



  • Beim reinen remove sehe ich auch keinen Grund. Bei remove_if aber schon und das würde ich dann auch nur im Zusammenhang mit einem erase nutzen.
    remove hat aber eben den Vorteil?!, dass es auch auf normale Arrays angewandt werden kann. Wenn das ein Vorteil ist. 🙂



  • @otze:
    Dem Problem begegnet man, wie immer innerhalb der STL, wo ja häufiger Elemente umgelagert werden (man denke an das Einfügen mitten in einen vector), durch korrekte Kopiersemantik. Ein Objekt mit 0 überschreiben zu können, setzt ausserdem voraus, dass 0 für diesen Typ ein gültiger Wert ist 😉



  • LordJaxom schrieb:

    Braunstein schrieb:

    Meint ihr das aus 23.2.4 1

    ... Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

    Exakt. Das heisst auch muffmolchs Indexoperator funktioniert hinreichend korrekt 😉

    puh... ihr bringt mich hier ins schwitzen... da hab ich ja nochmal glück gehabt 😉



  • otze schrieb:

    Mal zum remove:
    Wenn die Funktionalität von remove "implementation defined" ist, dann würde das doch bedeuten, dass man damit rechnen muss, dass die Objekte einfach mit 0 überschrieben werden, oder? Wenn das Objekt aber kein POD ist, sondern selbst speicher verwaltet, dann würde der Zeiger darauf doch durch das Überschreiben verloren gehen?

    Wenn du 'p=remove(b,e,v);' aufrufst, ist garantiert, daß der zu löschende Wert nicht mehr im Bereich [b,p[ vorkommt und daß alle anderen Elemente in der ursprünglichen Reihenfolge bleiben - was im Bereich [p,e[ zurückbleibt, ist afaik nicht spezifiziert (allerdings sind die Objekte dort noch technisch intakt).


Anmelden zum Antworten