Doppel-Map?
-
Hoi!

Kann sein dass es eine offensichtliche Lösung dafür gibt, aber ich komme gerade nicht drauf, also ...
Ich habe Paare an Werten, die eng miteinander assoziiert sind, nämlich eine ID + zugehörige Stringrepresentation.
Jetzt wollte ich eine (Hash?) Map nutzen, um eine ID in die Stringrepräsentation bzw die Stringrepräsentation in die ID konvertieren zu können.
Nur geht das natürlich mit einer Map immer nur in eine Richtung, dh. ich müsste 2 Maps verwalten, was deutlich erhöhter Aufwand wäre und ein vector wäre bei 10.000 Elementen warscheinlich auch performancetechnisch deutlich unterlegen.Was wäre die effizienteste Methode dieses Vertauschen von Key und Value zu realisieren?
Grüße und danke schonbmal,
Ethon
-
Eine Bimap aus boost vielleicht?
http://www.boost.org/doc/libs/1_47_0/libs/bimap/doc/html/index.html
-
Musst du immer wieder neuen strings neue ids zuweisen, oder weißt du zu einem bestimmten Zeitpunkt schon alle strings die jemals auftauchen werden?
Wenn letzteres der Fall ist könntest du einfach einen std::vector< string > nehmen, ihn mit allen strings befüllen, ein std::sort drüber laufen lassen (bin mir nicht sicher ob std::string operator< hat, sonst musst du halt irgendein eigenes Prädikat verwenden, z.B. string::c_str() vergleichen ).
Die id zu einem string ist dann einfach seine Position im vector, die du per std::binary_search mit O( log n ) finden kannst.
-
Cachus schrieb:
Eine Bimap aus boost vielleicht?
http://www.boost.org/doc/libs/1_47_0/libs/bimap/doc/html/index.htmlKlingt gut, sehe ich mir mal an, danke!

Die id zu einem string ist dann einfach seine Position im vector, die du per std::binary_search mit O( log n ) finden kannst.
Das Problem ist dass die IDs nicht fortlaufend sind.
Eher nach dem Schema: 1, 2, 3, 7, 9, 10, 11, 16, 21
Und darauf habe ich leider keinen Einfluss.
-
Dann vielleicht eine andere Lösung:
Du speicherst alle std::string irgendwo.
Dann benutzt du 2 Maps:std::map< unsigned int , std::string* > int_string_map; std::map< std::string* , unsigned int > string_int_map;Um die std::strings in einem vector speichern zu können könntest du auch statt pointern einfach Indizes in den maps speichern. Auf die Weise hättest du sowohl für id -> string als auch für string -> id zumindest O( log n ). Kostet halt mehr Speicher und ist ineffektiver beim Einfügen/Entfernen. Ich bin mir nicht sicher, wie boost::bimap umgesetzt ist, aber wenn die sowas auch schon machen, würde ich lieber die fertige Lösung verwenden.