Unique macht nich was es soll



  • Ich habe einen std::vector<int>, der eine sortierte Zahlenfolge enthält:
    1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 7, 7, 9
    Rufe ich dann unique(vector_name.begin(), vector_name.end()) auf und drucke den Vector wieder aus, erhalte ich das:
    1, 2, 3, 4, 5, 7, 9, 3, 3, 3, 4, 4, 5, 7, 7, 9
    Das Ergebnis is nicht ganz das, was ich erwartet habe. Ich habe die Spezifikation gelesen und sowas erwartet, das der Vector in zwei Teile geteilt wird, wovon der erste jeden Eintrag nur einmal enthält und der zweite die restlichen Einträge. Zurückgegeben wird der Iterator, der auf das erste Element des zweiten Teils zeigt.
    Wieso kommt dann z.B. die 1 nur einmal im ganzen Unique-Vector vor, die 3 aber vier Mal?

    Thanx in advance,
    styler.



  • such im forum nach unique. da findeste was zu



  • Hallo,

    Wieso kommt dann z.B. die 1 nur einmal im ganzen Unique-Vector vor, die 3 aber vier Mal?

    Darauf kannst du dich nicht verlassen. unique macht *keine* Aussagen darüber, was mit den doppelten Zahlen passiert. Es garantiert dir nur, dass in der Sequenz [begin, newend) keine doppelten Werte vorkommen und dass sich die absolute Länge des Sequenz nicht verändert. Was für Werte später zwischen newend und end liegen ist abhängig vom konkreten Algo. Es müssen nicht mal die Werte sein, die doppelt waren.
    Allerdings sollten dich diese Werte auch nicht interessieren. Schließlich geht es einem darum in einer Sequenz jeden Wert nur genau einmal zu haben. Nicht darum doppelte Werte an eine bestimmte Stelle zu packen.

    unique gehört auch zu den Algos die man in der Regel in Kombination mit erase aufruft:

    container c;
    ...
    c.erase(unique(c.begin(), c.end()), c.end());
    

Anmelden zum Antworten