Aufeinanderfolgende Elemente löschen



  • Hallo,

    ich habe heute einen Fall gehabt, wo ich überlegt habe, ob es da nicht schon was fertiges gibt.

    Und zwar möchte ich aus einem vector "gleiche" aufeinanderfolgende Elemente löschen (gleich bei mir: ungleiches Vorzeichen). Beispiel:
    vector<int> v = { 1, 2, -2, 3, 3, 4, -4, 5 } soll zu
    v = { 1, 3, 3, 5 }
    werden.

    Im Prinzip also ein erase-remove_adjacent_if-Pattern. Gibt es dieses remove_adjacent_if schon irgendwo? Finde irgendwie nichts.

    Ich meine, es ist jetzt nicht sooo schwierig zu implementieren (irgendwie mit einem while + std::adjacent_find_if würde ich es wohl machen), aber man kann doch Fehler dabei machen. Vielleicht muss ich mir die Mühe ja nicht machen?



  • std::unqiue() ist wohl exakt was du suchst.



  • Nein.

    Das std::unique löscht von mehreren gleichen alle bis auf das erste. Ich möchte bei 2 gleichen (daher auch meine Idee mit adjacent_find) beide löschen.

    Wenn ich unique auf mein Beispiel anwende, ergibt sich:

    root [0] vector<int> v = { 1, 2, -2, 3, 3, 4, -4, 5 };
    root [1] v.erase(unique(begin(v), end(v), [](int a, int b){return a==-b;}), v.end());
    root [2] v
    (std::vector<int> &) { 1, 2, 3, 3, 4, 5 }
    

    Das ist offensichtlich nicht dasselbe wie mein geforderter Beispieloutput im Ursprungspost:

    v = { 1, 3, 3, 5 }
    

    (hier ist noch die 2 und 4 drin).


Log in to reply