3 Stimmen

Mehrere Schlüssel-Hash-Tabelle (unordered_map)

Ich muss mehrere Schlüssel (vom Typ int) verwenden, um einen einzelnen Wert aus einer Hashtabelle zu speichern und abzurufen. Ich würde mehrere Schlüssel verwenden, um ein einzelnes Element zu indizieren. Ich benötige schnelles Einfügen und Nachschlagen für die Hashtabelle. Übrigens darf ich die Boost-Bibliothek nicht in der Implementierung verwenden.

Wie könnte ich das machen?

4voto

Yakov Galka Punkte 65787

Wenn Sie meinen, dass zwei ints einen einzigen Schlüssel bilden, dann unordered_map, value_type>. Wenn Sie dieselbe Datensammlung nach mehreren Schlüsseln indizieren möchten, schauen Sie sich Boost.MultiIndex an.

2voto

Steve Townsend Punkte 52288

Wenn der Schlüssel zu Ihrem Behälter aus der Kombination mehrerer ints besteht, könnten Sie boost::tuple als Ihren Schlüssel verwenden, um die ints ohne zusätzliche Arbeit Ihrerseits zu kapseln. Dies gilt, vorausgesetzt, die Anzahl der Schlüssel int-Teilkomponenten ist festgelegt.

1voto

jkerian Punkte 15571

Der einfachste Weg ist wahrscheinlich, eine Map aus Pointern/Indizes zu den Elementen in einer Liste zu behalten.

Ein paar weitere Details sind hier jedoch erforderlich. Benötigen Sie Unterstützung für Löschvorgänge? Wie sind die Elemente eingerichtet? Können Sie boost::shared pointer verwenden? (ziemlich hilfreich, wenn Sie Löschvorgänge unterstützen müssen)

Ich nehme an, dass das Wertobjekt in diesem Fall groß ist oder es einen anderen Grund gibt, warum Sie Werte nicht einfach in einer regulären Map duplizieren können.

0voto

aeh Punkte 781

Wenn es immer eine Kombination für die Abfrage gibt.

Dann ist es besser, einen einzigen Verbundschlüssel mit mehreren Schlüsseln zu bilden.

Du kannst das entweder tun

  1. Indem du den Schlüssel als eine verkettete Zeichenfolge von Ganzzahlen speicherst wie

     (int1,int2,int3) => Daten
  2. Verwendung eines höherwertigen Datentyps wie uint64_t, bei dem u einzelne Werte hinzufügen kannst, um einen Schlüssel zu bilden

    // Siehe Kommentar unten für den Ansatz

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X