Element mit 2 Keytypen
-
Servus,
folgendes Problem: Ich habe Overlay* Element, die ich sowohl per Name als auch Order (int) speichern will.
Wie macht man das am besten?
Im Moment halte ich die Element in 2 verschiedenen Maps:
map<string, Overlay*> mOverlaysByName;
map<int, Overlay*> mOverlaysByOrder;Das doofe ist halt, dass ich alle Einfüge/Lösch etc Operationen immer auf 2 Maps habe. Ist mein Ansatz ok oder ginge das vielleicht besser (mit nur einer Struktur?)
-
Ich finde deinen Ansatz leicht fehleranfällig (man könnte versehentlich n Overlay* nur in eine map einfügen).
Ich glaube es wäre besser eine Klasse für sowas zu definieren. Dann kannst du, mit einem einfachen Methodenaufruf, Sachen in beide maps einfügen, löschen etc. Und dann kannst du noch 2 Getter-Methoden implementieren: eine für den Zugriff auf die Daten mittels Order und noch eine für den Zugriff per Name.
-
Dann verschiebe ich doch nur das Problem. In dieser Klasse hätte ich dann ja wieder 2 Maps...
-
Struktuerr schrieb:
Dann verschiebe ich doch nur das Problem. In dieser Klasse hätte ich dann ja wieder 2 Maps...
Du wirst auch nicht um zwei Maps herumkommen. Auch wenn du alles in eine Struktur packst, musst du weiterhin die Vergleichsfunktion angeben. Daher ist die Lösung natürlich, dir eine Klasse als Wrapper zu bauen. Und nein, du verschiebst das Problem damit nicht, da du so wesentlich weniger Code-Wiederholungen hast. Außerhalb der Klasse musst du nämlich nur noch mit einem Objekt arbeiten.
-
Naja, man kann schon um 2 maps rumkommen, wenn man den o(log n) zugriff nur für einen keytype braucht. Den anderen kann man dann halt mit o(n) holen. oder man macht name/id voneinander abhängig, dann kann man das eine ins andere umrechnen.
Bei dem wrapper ist das Problem, das man ebenso eine identifizierung name<-> id braucht, um die beiden maps mit O(log n) synchron zu halten. Wenn das Overlay* das eh weiß, ist es kein Problem, ist aber denk ich unüblich.
Persönlich würd ich auch erstmal n wrapper schreiben, das macht wohl langfristig einfach viel weniger kopfzerbrechen.
Vorschlag:
struct OverlayInt { Overlay* ov; int id; }; struct OverlayName { Overlay* ov; string name; }; class OverlayWrap { map<string, OverlayInt> nameMap; map<int, OverlayName> idMap; public: //... };