Für eine effiziente Speicherung können Sie, abhängig vom genauen Wertebereich, Bitoperationen verwenden, um die Schlüssel/Wert-Paare in einem einzigen Wert zu speichern: Wenn die Werte beispielsweise sehr klein sind, könnten Sie sogar 24 Bit verwenden die Schlüssel und 8 Bits für die Werte, was zu einem einzelnen 32-Bit-Eintrag führt. Ich glaube, dass die meisten Compiler heutzutage 32- oder 64-Bit-Alignments verwenden, so dass das Speichern von beispielsweise 32-Bit-Schlüsseln und 16-Bit-Werten immer noch 64 Bit pro Eintrag erfordert. Die Verwendung einfacher Komprimierung kann auch für die Leistung von Vorteil sein, wenn der Flaschenhals die Speicherbus- und Cache-Fehler sind, und nicht die CPU selbst.
Dann hängt es von der Art der Operationen ab, die Sie ausführen möchten. Die einfachste Art, die Schlüssel zu speichern, wäre ein sortiertes Array von Strukturen oder der kombinierte Ley/Value-Eintrag, den ich oben vorgeschlagen habe. Dies ist schnell und sehr platzsparend, erfordert jedoch O (log n) Lookup.
Wenn Sie etwas ausgefallener sein möchten, könnten Sie perfect hashing verwenden, die Idee ist es, eine Hash-Funktion zu finden, die eindeutige Hash-Werte für jeden Schlüssel erzeugt. Dies ermöglicht, dass die Hashmap ein einfaches Array ist, das nur geringfügig größer sein muss als das sortierte Array, das ich oben vorgeschlagen habe. Das Finden einer guten Hash-Funktion sollte relativ schnell sein, Sie können es noch einfacher machen, indem Sie das Array ein wenig größer machen und einige ungenutzte Felder im Array zulassen. Here ist eine Implementierung von perfektem Hashing, aber ich habe es selbst nicht verwendet.
In beiden Fällen wäre der Speicherverbrauch: (Anzahl der Paare) * (Bit pro Eintrag) Bit, plus Speichern der Hash-Funktion, wenn Sie den zweiten Ansatz verwenden.
** EDIT **
Aktualisiert nach Kommentar von @FireLancer. Außerdem wurden einige Wörter zur Leistung von komprimierten Arrays hinzugefügt.
Ist jedes der 200 "Sets" seine eigene einzigartige Karte? – WhozCraig
Haben Sie 'std :: map' versucht? – Galik
@Galik weder so platzsparend und vor allem nicht so performant, wie 'std :: unordered_map' für diesen Fall. Ich bin eher neugierig, ob es eine Abstimmung der Löffelgröße gibt. – WhozCraig