Mit Tupel in unordered_map
Möchte ich ein Tupel, bestehend aus int
,char
,char
in meinem unordered_map
. Ich mache das so:
#include <string>
#include <unordered_map>
#include <cstring>
#include <iostream>
#include <tuple>
using namespace std;
tuple <int,char,char> kk;
unordered_map<kk,int> map;
int main()
{
map[1,"c","b"]=23;
return 0;
}
aber das gibt mir folgenden Fehler:
map.cpp:9:21: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> class std::unordered_map’
map.cpp:9:21: error: expected a type, got ‘kk’
map.cpp:9:21: error: template argument 3 is invalid
map.cpp:9:21: error: template argument 4 is invalid
map.cpp:9:21: error: template argument 5 is invalid
map.cpp:9:26: error: invalid type in declaration before ‘;’ token
map.cpp: In function ‘int main()’:
map.cpp:14:16: error: assignment of read-only location ‘"b"[map]’
Was mache ich falsch in diesem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Vorlage Argumente für eine unordered_map sieht wie folgt aus:
std::hash
ist nicht spezialisiert für Tupel (scrollen Sie nach unten, um Standard-Spezialisierungen für die Bibliothek-Typen). Daher müssen Sie Ihre eigenen, so etwas wie dieses:Und schließlich, als Benjamin Lindley Antwort bereits-Adressen, die Sie verwenden müssen
std::make_tuple
:Den code heruntergeladen wurde aus Mit einer std::tuple als Schlüssel für std::unordered_map und hier ist die Live-Beispiel.
key_hash
ist oben definiert. Später benutzen wir es als eines der template-Argumente (wo unordered_map erfordert ein Hash).Erste Fehler:
Als der Fehler sagt ganz klar, der template-parameter muss ein Typ sein.
kk
ist nicht eine Art, es ist ein Objekt. Vielleicht bedeutet Sie, um es ein typedef?Zweite Fehler:
Zwei Probleme hier. Ersten, indem Kommas zwischen den Werten nicht machen, ein Tupel aus Ihnen heraus. Sie müssen explizit über es, entweder ruft den Konstruktor des Tupels den Typ oder der Verwendung einer Funktion gibt ein Tupel (z.B.
std::make_tuple
). Zweitens, Ihre Tupel erwartet chars ('c','b'
), keine strings ("c","b"
).Als wies darauf hin, std::hash ist nicht spezialisiert für Tupel. Allerdings, wenn Sie Ihre Tupel besteht aus standard-hashable-Typen wie string und int, den folgenden code aus generic-hash-für-Tupel-in-ungeordnete-Karte-ungeordnete-set wird automatisch fügen Sie eine solche Unterstützung in c++11.
Fügen Sie einfach den code in eine header-Datei, und schließen Sie es, Wann immer erforderlich:
Hatte ich eine Anforderung der Karte statt der ungeordneten map:
key war 3-Tupel und
Wert wurde ein 4-Tupel
sehen Sie alle Antworten, ich war zu ändern, um Paare
aber unten bei mir funktioniert:
Bin ich mit visual studio community 2015 ide
Hier ist eine Methode, um Tupel als Schlüssel für ein unordered_map ohne Verwendung einer hash-Spezialisierung:
Ausgabe: