STL: Ordered Map?



  • Hi,

    ich suche eine Standardimplementierung für eine Art Ordered Map:

    Zum einen möchte ich per Key auf die Elemente zugreifen können (also z.B. map["key"]) und zum anderen soll die Reihenfolge der Elemente in dieser Map so sein, wie sie beim Füllen vorgegeben wurde, d.h. wenn ich als 5. Element ein "bla" angefügt haben, dann soll ein Key-loser Zugriff auf das 5. Element dieser Map auch wieder "bla" zurückliefern.

    D.h. das wäre eine Kombination aus Hash-Map und Liste.

    Gibt es da was vorgefertigtes oder muss ich mir da selber was bauen?



  • Da wirst du dir wohl selber was bauen müssen, weder in der STL, TR1 oder boost gibt´s einen Container, der das bietet.

    Edit:
    Mit etwas Trickserei könnte man vielleicht boost::bimap für soetwas missbrauchen.


  • Administrator

    In Boost gibt es sowas:
    http://www.boost.org/doc/libs/1_44_0/libs/multi_index/doc/index.html

    Es ist zu empfehlen, den entstehenden Typ als typedef zu definieren 🤡

    Grüssli



  • Dravere schrieb:

    In Boost gibt es sowas:
    http://www.boost.org/doc/libs/1_44_0/libs/multi_index/doc/index.html

    Es ist zu empfehlen, den entstehenden Typ als typedef zu definieren 🤡

    Grüssli

    Erlaubt das Ding nicht nur den Zugriff über definierte Indizes, d.h. man muss den linearen Zugriff über einen entsprechenden Index zu realisieren?



  • Danke für die Tipps, aber nur dafür werde ich mir nicht extra den Boost-Klotz ans Bein binden. Es wird also eine eigene Implementierung werden.



  • Blampf schrieb:

    ... aber nur dafür werde ich mir nicht extra den Boost-Klotz ans Bein binden.

    Was ist ein Boost-Klotz? Für deine Anforderung brauchst du nur die Header.



  • DocShoe schrieb:

    Erlaubt das Ding nicht nur den Zugriff über definierte Indizes, d.h. man muss den linearen Zugriff über einen entsprechenden Index zu realisieren?

    Es gibt auch einen random access "index".

    Blampf schrieb:

    ...dafür werde ich mir nicht extra den Boost-Klotz ans Bein binden. Es wird also eine eigene Implementierung werden.

    Der war gut. Was kann klotziger sein, als etwas wie einen Multi Index Container selber schreiben zu müssen. Der boost mulit_index_container ist ne ziemlich tolle Sache. Kompiliert nur ne ganze Weile, wenn man viele Indizes definiert.



  • Blampf schrieb:

    Danke für die Tipps, aber nur dafür werde ich mir nicht extra den Boost-Klotz ans Bein binden.

    Wozu sich die C++ Runtime ans Bein binden, wozu gibt es Assembler?

    Boost ist kein Klotz, da der größte Teil von Boost Header-Only ist. Und selbst wenn nicht, benötigt man selten viel von Boost (Da Boost nicht eine Bibliothek, sondern eine Bibliothekssammlung ist). Ansonsten sollte man sich auch dreimal überlegen, bevor man irgendein Framework verwendet (den jedes Framework ist an sich ein Klotz...).



  • asc schrieb:

    Wozu sich die C++ Runtime ans Bein binden, wozu gibt es Assembler?

    Der Vergleich hinkt nicht nur, der ist schon querschnittsgelähmt.

    Nur weil hier meine Anforderungen nicht bekannt sind, heißt das noch lange nicht, dass Ihr die Götter seid und alle anderen zwangsläufig dämlich sein müssen.

    Fakt ist: in meiner Umgebung ist die C++-Runtime in jedem Fall schon dabei, alles was ich aus dieser Bibliothek nehme, erzeugt mir exakt NULL zusätzlichen Overhead und Ressourcenverbrauch. Boost hingegen wäre ein zusätzliches Paket, welches aus Platzgründen nicht in Frage kommt. Also IST Boost ein Klotz, den ich vermeiden möchte und werde.



  • Jeder vernünftige Compiler schmeißt beim Link-Prozess das unbenötigte Zeug raus. Selbst wenn Boost 100 MB groß ist. Wenn du nur eine Klasse davon benutzt, wirst du hoffentlich einen Compiler einsetzen, der so schlau ist, keine 100 MB EXE zu erzeugen.

    Gib es zu: du weißt nicht wie man Boost nutzt und versuchst fadenscheinige Gründe als Ausrede zu finden.



  • Artchi schrieb:

    keine 100 MB EXE zu erzeugen

    Komisch, bei mir kommt überhaupt keine .EXE-Datei raus. Und nun?



  • Blampf schrieb:

    Komisch, bei mir kommt überhaupt keine .EXE-Datei raus. Und nun?

    Artchi schrieb:

    Gib es zu: du weißt nicht wie man Boost nutzt und versuchst fadenscheinige Gründe als Ausrede zu finden.



  • Na dann erkläre du es mir mal:

    Ich habe hier ein System mit zertifizierten Komponenten. Nehme ich irgend was neues (wie z.B. Boost) dazu, darf ich das auch zertifizieren lassen, was Zeit und Geld kostet. Und selbst wenn das nur ein paar Headerfiles sind, aus denen ich mir irgend welche Templates reinziehe: da es 3rd Party ist, steht dafür eine separate Zertifizierung an!

    Bei der STL ist das nicht der Fall, da ich dafür bereits eine Zertifizierung habe und weswegen ich in meinem Posting ja auch explizit danach gefragt habe (scheinbar sind einige auch schon beim Lesen der Fragestellung überfordert).

    So, und jetzt bist du dran!



  • So und deinen eigenen Code musst du wohl nicht zertifizieren lassen? Ob du nun selber die Header schreibst oder jemand anderes geschrieben hat, sollte ja wohl egal sein.
    Außerdem ging es um die fadenscheinigen Argumente, wo du nichts besseres drauf wusstest zu antworten, dass dein Binary keine exe ist.



  • > So und deinen eigenen Code musst du wohl nicht zertifizieren lassen?

    Doch muss ich - aber den muss ich sowieso zertifizieren lassen, wohingegen das bei jedem neuen Paket noch mal ZUSÄTZLICH erforderlich ist (Kannst du rechnen? Eigener Code=1 plus Boost=2, 2 ist größer und damit mehr/teurer/aufwändiger als 1).

    > Ob du nun selber die Header schreibst oder jemand anderes geschrieben hat, sollte ja
    > wohl egal sein.

    Oh, schöne Welt der Amateursoftware! Nein, es ist hier eben nicht egal, der Erfinder der Zertifizierung will wohl ein paar mal öfter abkassieren.

    > Außerdem ging es um die fadenscheinigen Argumente, wo du nichts besseres drauf
    > wusstest zu antworten, dass dein Binary keine exe ist

    Sorry, aber nur weil 80% der Leute, die hier geantwortet haben, die Frage nicht lesen konnten, muss ich doch nicht jedem sofort und immer jedes Details meines Projektes erklären?



  • Dravere schrieb:

    In Boost gibt es sowas:
    http://www.boost.org/doc/libs/1_44_0/libs/multi_index/doc/index.html

    Es ist zu empfehlen, den entstehenden Typ als typedef zu definieren 🤡

    Grüssli

    Ich würde eher empfehlen vom "entstehenden Typ" eine Dummy-Klasse abzuleiten. Das funktioniert dann auch bei Fehlermeldungen & Warnings, und hält auch die Bezeichner in den obj Files kürzer.



  • Blampf schrieb:

    Bei der STL ist das nicht der Fall, da ich dafür bereits eine Zertifizierung habe und weswegen ich in meinem Posting ja auch explizit danach gefragt habe (scheinbar sind einige auch schon beim Lesen der Fragestellung überfordert).

    1. Hast du nirgends vorher explizit auf diesen Umstand hingewiesen.
    2. Hast du in deinem Eingangspost definitiv gefragt ob es etwas vorgefertigtes gibt.
    3. Ist die Aussage das Boost ein "Klotz" ist, ebenso wie deine anderen Punkte, wenn man die erst jetzt erwähnte Zertifizierung außen vor lässt, einfach nur Unsinn.
    4. Gelten die Boost-Bibliotheken, mit Ausnahme der Standardbibliothek, am nächsten an dem Standard, und sind bereits teilweise in die Standardbibliothek übernommen (z.B. als Teil es TR1) oder werden noch übernommen (z.B. Teile des kommenden Standards).

    Daher solltest du dir Äußerungen wie "scheinbar sind einige auch schon beim Lesen der Fragestellung überfordert" vielleicht nochmal überlegen, falls du in Zukunft noch Antworten erhoffst. Wir haben keine Glaskugel um deine Hausgemachten Probleme zu erkennen, bevor sie genannt werden, und können uns nur auf die gegebenen Informationen und Aussagen beziehen (Die Zertifizierung ist bislang das einzige Argument das ich gegen Boost gelten lasse).



  • Was Deinen Zweck wahrscheinlich erfüllt - wenn ich das richtig verstanden habe - ist eine Map, die statt der Werte die Indizes eines Vektors speichert, der die eigentlichen Werte enthält. Wrapper Klasse drum, die operator[] für int und typename T überlädt. Fertig. Oder?



  • Blampf schrieb:

    Hi,

    ich suche eine Standardimplementierung für eine Art Ordered Map:

    Zum einen möchte ich per Key auf die Elemente zugreifen können (also z.B. map["key"]) und zum anderen soll die Reihenfolge der Elemente in dieser Map so sein, wie sie beim Füllen vorgegeben wurde, d.h. wenn ich als 5. Element ein "bla" angefügt haben, dann soll ein Key-loser Zugriff auf das 5. Element dieser Map auch wieder "bla" zurückliefern.

    D.h. das wäre eine Kombination aus Hash-Map und Liste.

    Gibt es da was vorgefertigtes oder muss ich mir da selber was bauen?

    Blampf schrieb:

    Na dann erkläre du es mir mal:

    Ich habe hier ein System mit zertifizierten Komponenten. Nehme ich irgend was neues (wie z.B. Boost) dazu, darf ich das auch zertifizieren lassen, was Zeit und Geld kostet. Und selbst wenn das nur ein paar Headerfiles sind, aus denen ich mir irgend welche Templates reinziehe: da es 3rd Party ist, steht dafür eine separate Zertifizierung an!

    Bei der STL ist das nicht der Fall, da ich dafür bereits eine Zertifizierung habe und weswegen ich in meinem Posting ja auch explizit danach gefragt habe (scheinbar sind einige auch schon beim Lesen der Fragestellung überfordert).

    So, und jetzt bist du dran!

    Damit ist deine ganze Fragerei völlig sinnlos. Es gibt eine handvoll verschiedener Container in der STL/TR1, du hättest dir einfach mal die Zeit nehmen sollen, um anzusehen, ob einer davon deinen Anforderungen genügt.
    Wenn ja => Frage unnötig, weil Lösung selbst gefunden
    Wenn nein => Frage unnötig, weil Lösung durch 3rd Party nicht akzeptabel

    Was genau willst du eigentlich?



  • Blampf schrieb:

    Doch muss ich - aber den muss ich sowieso zertifizieren lassen, wohingegen das bei jedem neuen Paket noch mal ZUSÄTZLICH erforderlich ist

    Keiner weiß, wie deine Zertifizierung abgerechnet wird, außer du selbst. Aber wenn ich etwas benötige, erst recht im gewerblichen Umfeld, dann versuche ich eine Lösung zu finden und nicht zu ningeln, wie doof doch alles ist.
    Je nachdem wie oft du das Paket Boost brauchst, was spricht dagegen es in dein Paket einzugliedern? Doch nur wenn du es noch mal verwenden willst und dann lohnt es sich auch gleich ganz das Paket zertifizieren zu lassen.

    Blampf schrieb:

    Oh, schöne Welt der Amateursoftware! Nein, es ist hier eben nicht egal, der Erfinder der Zertifizierung will wohl ein paar mal öfter abkassieren.

    Ich finde es eher Amateurhaft zu behaupten, ihr hättet da nicht schon bisher Mittel und Wege gefunden, um den Preis zu drücken.

    Blampf schrieb:

    Sorry, aber nur weil 80% der Leute, die hier geantwortet haben, die Frage nicht lesen konnten, muss ich doch nicht jedem sofort und immer jedes Details meines Projektes erklären?

    Nein musst du nicht, dir scheint deine Antwort aber nicht wirklich bewusst zu sein. Wenn du einfach gesagt hättest 3rd Party ist nicht, dann wäre auch gut gewesen ohne zuviele Details zu verraten.


Log in to reply