RadStudio unordered_map
-
Hallo,
ich arbeite mit Radstudio und benutze eine unordered_map die integer-Werte aus einer Schleife aufnimmt, die Ausgabe ist aber durcheinander und ich wollte wissen ob das seine Richtigkeit hat. Der klassische Compiler ist hierbei deaktiviert um diese map nutzen zu können.
#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <unordered_map> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; typedef std::unordered_map<int, int> Mymap; Mymap c1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { for(int a = 0; a < 10;a++) { c1.insert(Mymap::value_type(a, 0)); } for (Mymap::iterator it = c1.begin(); it != c1.end(); ++it) { ShowMessage(it->first); } //Ausgabe: 8, 0, 1, 2, 3, 4, 5, 6, 7, 9 }
-
Das Ding heißt unordered_map.
-
unordered_map - fällt dir etwas auf?
-
@manni66 Ja klar, der Name sagt es ja schon. Ich bin aber davon ausgegangen das es so wie die Schleife läuft eingetragen wird in die map die ja nicht sortiert wird.
-
Nicht sortiert bedeutet doch eigentlich unberührt es wird so übernommen wie eingetragen, da habe ich halt ein falsches Verständniss. Ich setze wahrscheinlich nicht-sortiert mit ungeordnet auf ein und das selbe in meiner Denke, ich weiss es nicht ob es daran liegt.
-
Wenn du solche Fragen hast, solltest du einfach mal in die Referenz schauen. Oft hilft die weiter.
-
Naja wenn ich es falsch verstehe dann kann man da halt auch nix mehr machen, ausser sich aufzuhängen.
-
@Gestalt sagte in RadStudio unordered_map:
Nicht sortiert bedeutet doch eigentlich unberührt es wird so übernommen wie eingetragen
Nein. Verbreiteter Aberglaube.
-
@Gestalt Du könntest einen std::vector nehmen, wenn die Reihenfolge erhalten bleiben soll.
-
@Wutz
In einen Projekt bei der Firma, für die gerade tätig bin, hat man mal von langer Zeit (Visual Studio 6) aus der Mfc irgendeine Container Klasse benutzt. Diese hatte damals die Eigenschaft, die Einträge in umgekehrter Richtung zu speichern, was aber nicht so dokumentiert war. Als man dann auf VS 2017 umstieg, funktioniere diese Ausgabe nicht mehr so.
-
@Burkhi Ja, da bleibt einem nix anderes übrig, das läuft zuverlässig in Verbindung mit find ist das auffinden des Keys dann wie in in einer map.
-
@Burkhi ja ich hatte die unordered_map auch anders in Erinnerung aber mit den neuen Compilern fällt das normale verhalten sehr schnell auf eben ungeordnet. Ich hatte vor paar Jahren andere Ergebnisse als ich diese heute bekomme.
-
Du könntest auch parallel eine map führen, falls du die schnelleren key zugriffe brauchst, die dann als value den index im vector beinhaltet.
Wenn du die Liste viel modifizierst würde ich das kapseln, sonst wirds vermutlich schnell buggy.
-
@Wutz sagte in RadStudio unordered_map:
@Gestalt sagte in RadStudio unordered_map:
Nicht sortiert bedeutet doch eigentlich unberührt es wird so übernommen wie eingetragen
Nein. Verbreiteter Aberglaube.
Ja, offensichtlich.
-
@5cript genauso mache ich es schon die ganze Zeit, da läuft auch nichts bei schief, habe ich mir selber ausgedacht (Vector und parallel dazu map), krass das diese Variante empfohlen wird. :). Durch eine Programmänderung ist mir dann das Problem mit der unordered_map erst aufgefallen, vorher hat es keine Rolle gespielt wie da was sortiert war.
-
Man kann für solche Dinge auch Boost.Multiindex verwenden: https://www.boost.org/doc/libs/1_73_0/libs/multi_index/doc/index.html
-
@Gestalt sagte in RadStudio unordered_map:
@5cript genauso mache ich es schon die ganze Zeit, da läuft auch nichts bei schief, habe ich mir selber ausgedacht (Vector und parallel dazu map), krass das diese Variante empfohlen wird. :). Durch eine Programmänderung ist mir dann das Problem mit der unordered_map erst aufgefallen, vorher hat es keine Rolle gespielt wie da was sortiert war.
Die Kombination aus mehreren Containern ist gar nicht selten. Ganz oft habe ich z.b. Anwendungsfälle bei denen ich Objekte in mehreren Containern lageren muss ( als Shared_ptr ) um auf verschiedenste Arten effizient drauf zugreifen zu können.
std::vector<std::shared_ptr<T>> ZugriffPerIndex; std::unordered_map<std::string, std::shared_ptr<T>> ZugriffPerKey;
Wobei man auch gut überlegen muss, ob sich eine Map lohnt. Bei wenigen Elementen ist eine manuelle Suche im vector deutlich schneller als die Suche in einer Map mittels find.
Ich habe mir mal als ungefähre Grenze mal irgendwann 100 als Orientierung gesetzt. Ich glaube aber gelesen zu haben, dass die Grenze sogar noch höher liegt.