Wie sortiere ich eine map?



  • Hi!

    Ich hab ein Problem mit einer C++-map. Ich habe eine map<unsigned, myClass>, die als Schlüssel ein unsigned verwendet und als Wert eine von mir definierte Klasse.

    Die unsigned-Werte, die ich als Schlüssel verwende, sind Datum-Werte, z.B. 20050814. Ich lese viele Werte in die map ein (ca. 1400) und das Problem ist, dass die map sich anscheinend irgendwann (ich glaub mal gelesen zu haben, wenn sie eine anfangs definierte Größe überschreitet) resizet wird und dadurch aber meine Datums-Werte durcheinanderkommen.

    D.h. obwohl ich die Werte mit aufsteigendem Datum einfüge, z.B. vom 1.1.2001 (20010101) bis zum 14.8.2005 (20050814), liegen sie nach dem Füllen der map nicht mehr in dieser Reihenfolge vor, sondern etwa so 20020712 bis 20050814, dann 20010101 bis 20020711.

    Mir sind 2 Dinge eingefallen, was ich tun könnte, ich weiß jedoch nicht wie es geht:

    1. die Map nach dem Füllen mit Daten sortieren, sort(mapName.begin(), mapName.end()) bringt mir 9 Fehler (evtl. weil ich myClass in der map verwende??)
    2. die Größe der map bereits vor dem Füllen festlegen, sodass kein Resize auftritt.

    Wär super, wenn mir jemand sagen könnte, wie eines der beiden Dinge funktioniert.

    Danke & Gruß,
    Nico.



  • Die map sortiert sich intern selber, wenn deine Daten vor einem resize sortiert vorliegen ist das nur Zufall und du kannst dich darauf nicht verlassen.
    Und wenn du eine map sortieren willst liefert dir ein standardkonformer Compiler einen Fehler, da du damit die map nicht sortierst sondern durcheinander bringst.

    Ich glaube du willst eher ein std::vector< std::pair< unsigned, MyClass > >



  • z.b. so:

    std::map< unsigned , std::string, std::greater<unsigned> > myMap;



  • ein datum speichert man doch nicht in unsigned 🙄 🙄 🙄 🙄 🙄



  • Wie schon gesagt wurde, die map sortiert sich selbst.

    Da es keinen Datumstypen gibt, musst Du daher dafür sorgen, dass dein Comparator die richtige Reihenfolge erzeugt.

    Ganz einfach wird es, wenn Du das Datum z.B als Julianisches Datum mit einfachen Zahlen speicherst. Dann kannst Du das Beispiel von FireFlow nutzen und das Datum ist direkt korrekt sortiert.
    Ausserdem lässt sich sehr leicht damit rechnen.

    Würdest Deine Datumswerte in einem String speichern, funktioniert die map auch korrekt, sofern Du map< string, myClass*> nutzt.
    Aufgrund Deiner Sortierangabe würde ich eher vermuten, dass Du sowas wie
    map<myClass, xyz*> nutzt. Dann solltest Du Dir Deinen Vergleichsoperator anschauen.

    Eine map hat auch kein resize. Anders als beim vector ist kein Umkopieren notwendig (die einzelnen Elemente der map müssen nicht in einem zusammenhängenden Speicherbereich liegen).



  • @niemand ein resize in der Art nicht, aber wenn ein neues Element eingefügt wird, scheint sich die Sortierreihenfolge zu ändern (für die map scheints noch zu passen nur für nico nicht mehr).


Anmelden zum Antworten