std::list, wie funktioniert der vergleich?



  • SideWinder schrieb:

    Wenn sie unterscheidbar sind kannst du im schlechtesten Fall ja immer von "größer" reden wenn sie unterschiedlich sind und ansonsten von "gleich".

    Meines Wissens führt das zu einem undefinierten Verhalten beim Einfügen in einen std::set. In der Praxis ergibt sich u.U. eine Endlosschleife.
    Die Elemente müssen eindeutig sortierbar sein.

    Gruß
    Werner



  • Nein, das geht nicht, das wäre keine (totale?) Ordnungsrelation. Das verursacht höchstens Abstürze und Endlosschleifen.

    ich nehme an, da std::set den < operator verwendet, wird es eine totale ordnungsrelation verwenden. partielle ordnungen würden zudem "duplikate" zulassen.



  • Meines Wissens führt das zu einem undefinierten Verhalten beim Einfügen in einen std::set. In der Praxis ergibt sich u.U. eine Endlosschleife.
    Die Elemente müssen eindeutig sortierbar sein.

    mein erster versuch war tatsächlich einfach der, dass ich den op< als "op!=" implementiert hatte. mehrere testdurchläufe mit 2 mio. objekten mit vielen duplikaten sind auch recht fix durchgelaufen. es wurden aber erstaunlich wenig objekte entfernt, was mich auf die frage nach der art des vergleichs brachte.



  • Wenn ich nicht ganz falsch liege testet set auf (!(value<*it) && !(*it<value)).
    Wie wäre es mit ner std::map die als Schlüssel die Speicheradresse der konkreten Objekte nutzt?

    MfG Spacelord



  • hey, die idee ist gut. ich werds mal damit versuchen.



  • Naja,eigentlich ist die Idee ziemlicher Käse 😃 ,aber ich frag mich auch warum du unbedingt nen sortierten Container für nicht sortierbare Objekte brauchst 😕 !?
    Wie willst du denn jemals irgendwelche konkreten Objekte in der map wiederfinden?

    MfG Spacelord



  • die idee ist kein käse, denn so erspar ich mir das generieren eines keys.

    map vergleicht aber offenbar auch nicht alle objekte. also im endeffekt doch käse 😉

    ich brauch die objekte eigentlich nicht sortiert, ich brauch nur nen schnelle methode, duplikate zu entfernen. duplikate sind all jene objekte, bei denen bestimmte member variablen gleich sind.

    dachte halt, vielleicht hätte irgendne stl klasse ne schweinegeile methode eingebaut, auf duplikate zu überprüfen. aber es ist wohl doch bloss ne striktordnung.

    aber immerhin erspar ich es mir so, den ganzen krams komplett selbst implementieren zu müssen 😉 ich muss mir halt nur noch ne striktordnung für meine objekte ausdenken.



  • Eventuell ist dann sowas in der Art für dich von Interesse http://www.sgi.com/tech/stl/hash_set.html.
    Ansonsten kommst du in nem unsortierten Container immer auf O(n).Also wäre vielleicht auch std::unique ne Alternative.
    Oder schau mal ob boost dir was in der Richtung bietet...

    MfG Spacelord



  • Eigentlich ist es doch ziemlich simpel 'ne Vergleichsfunktion zu schreiben. Du betrachtest einfach beide Daten als ByteArray (oder int.. egal), wenn eins länger ist mit Nullen auffüllen. Und dann vergleichst du die ersten Einträge beider Arrays, ist einer größer, hast du das Ergebnis. Bei Gleichheit gehts mit dem nächsten weiter. Entweder findest du irgendwann einen Unterschied, oder die Objekte sind halt gleich.

    Bye, TGGC (Fakten)





  • doch nicht. macht nur nur aufeinanderfolgende duplikate weg.


Anmelden zum Antworten