Elegante Möglichkeit Einträge Aufrücken zu lassen



  • Ich habe einen Speicherberech fester Größe, der mit einer dynamischen Anzahl an POD-structs gefüllt ist. jetzt muss ich in der Mitte eins entfernen und die hinteren sollen aufrücken. Ich dachte gut wäre so etwas wie std::remove, das einen Iterator nimmt, aber das scheint es nicht zu geben. std::copy würde gehen, aber so richtig elegant scheint mir das nicht zu sein, da ich dann das ende des befüllten Bereiches selber ausrechnen müsste (was natürlich gehen würde). Gibt es etwas besseres?



  • Ein Remove, welches einen Iterator nimmt, müsste doch auch die Größe des Bereichs kennen?

    Seit C++11 gibt es std::move (in algorithm).



  • LordJaxom schrieb:

    Ein Remove, welches einen Iterator nimmt, müsste doch auch die Größe des Bereichs kennen?

    Klar, aber das muss das std::move mit einem Wert doch auch. Dazu gibt man doch zwei Iteratoren an.

    LordJaxom schrieb:

    Seit C++11 gibt es std::move (in algorithm).

    Das macht in diesem Fall das selbe wie std::copy.



  • Das Ende Deines Bereichs brauchst Du immer. Woher soll die (potentielle) Funktion das sonst wissen?

    Wo ist das Problem bei std::move(it + 1, std::end(array), it)?



  • LordJaxom schrieb:

    Das Ende Deines Bereichs brauchst Du immer. Woher soll die (potentielle) Funktion das sonst wissen?

    std::remove leifert den neuen "Ende-Iterator" zurück.

    LordJaxom schrieb:

    Wo ist das Problem bei std::move(it + 1, std::end(array), it)?

    Funktionieren tut das aber es ist halt etwas umständlich und es ist weniger offensichtlich, was diese Zeile macht, nämlich ein Element entfernen. Ich dachte das müsste besser gehen aber ich denke ich mache es einfach so.



  • LordJaxom schrieb:

    Wo ist das Problem bei std::move(it + 1, std::end(array), it)?

    Das hat übrigens ein großes Problem für den Sonder-Fall das it + 1 = std::end(array) ist. Da muss man also sogar noch ne Fallunterscheidung machen.



  • TNA schrieb:

    std::remove leifert den neuen "Ende-Iterator" zurück.

    Weiß ich. Aber beim Aufruf von std::remove musst Du auch den alten Ende-Iterator angeben.

    TNA schrieb:

    Das hat übrigens ein großes Problem für den Sonder-Fall das it + 1 = std::end(array) ist. Da muss man also sogar noch ne Fallunterscheidung machen.

    Wenn it + 1 == std::end(array), werden einfach 0 Elemente an die Stelle it kopiert. Keine Fallunterscheidung nötig.



  • Wie genau findest du den Iterator auf das zu entfernende Element und wieso genau kannst du nicht einfach std::remove verwenden?


Anmelden zum Antworten