std::vector Lücke nach Element Löschen schließen



  • Also wie es im Titel bereits steht, ich weiß nicht wirklich wie ich die Lücke, die durch das Löschen mit Erease wohl unweigerlich entsteht, wieder schließe. Das löschen klappt wunderbar, doch benutze ich dann den Vector weiter und wenn nun ein Durchlauf gestartet wird gibts ne Exception wenn er an der Lücke ankommt.

    Also meine Frage ist, wie ich die Lücke wieder geschlossen bekomme, oder welche Alternativen ich habe.



  • Naja zum rauslöschen eignet sich eigtl. besser eine std::list ... ansonsten kannst du ja einfach mal die Daten verschieben (performance ist im Arsch 😉 )



  • Ok danke ich werd mal schauen was bei einer std::list anders ist und werd sie vermutlich dann auch einsetzen, denn es wird ein größeres Projekt, wo die Performance zwar nicht perfekt sein muss, aber schon in einem geregelten Rahmen bleibt.



  • Entschuldigung für den Doppelpost, aber ich habe grad std::list probiert und komme damit irgendwie rein gar nicht klar, also meine Frage, ist es nicht irgendwie möglich das "Loch", welches durch das Löschen eines Elements in einem Vector entsteht zu schließen, natürlich kann ich durch einen zweiten Vector und einiges an Kopierarbeit das auch erledigen, aber performant ist was anderes, oder?


  • Mod

    was für ein loch?



  • Naja wenn ich irgendwo in einem vector etwas lösche, dann ist ja dort nichts mehr, die darauffolgenden Werte rutschen nicht nach, dadurch kommt es dazu, dass wenn ich den vector durchlaufe, um z.B. Werte zu speichern, an dieser undefinierten Stelle eine Exception geworfen wird.



  • Because vectors keep an array format, erasing on positions other than the vector end also moves all the elements after the segment erased to their new positions, which may not be a method as efficient as erasing in other kinds of sequence containers (deque, list).

    This invalidates all iterator and references to elements after position or first!

    ...

    #include <list>
    
    int main()
    {
        std::list<int> data;
        for (std::size_t i(0); i < 1000; ++i)
            data.push_back(1);
        std::list<int>::iterator it(data.begin()); // 1. Item
        data.erase(++it); // 2. Item löschen
        data.remove(100); // löscht, wo item == 100
    }
    

    usw.



  • erase lässt keine Lücke, alle nachfolgenden Elemente werden um eins nach vorne geschoben.



  • schön wie du wiederholen kannst 🙂



  • Das heißt mein Fehler liegt woanders und nicht daran, dass beim vector eine Lücke wäre, weil da gar keine ist? Ok das bringt mich sogar ein Stück weiter, denn ich merke gerade, dass ich den Fehler auch reproduzieren kann in Situationen, wo im vector gar nichts gelöscht wird.


Anmelden zum Antworten