unordered_map mit Paar als Schlüssel - nicht kompilieren
Ich versuche zum erstellen einer unordered_map zu anzeigen Paaren mit Ganzzahlen.
#include <unordered_map>
using namespace std;
using Vote = pair<string, string>;
using Unordered_map = unordered_map<Vote, int>;
Habe ich eine Klasse, wo ich erklärt haben, eine Unordered_map als privates Mitglied.
Bin ich allerdings immer diese Fehlermeldung wenn ich versuche zu kompilieren:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:948:38: Implicit instantiation of undefined template 'std::__1::hash<std::__1::pair<std::__1::basic_string<char>, std::__1::basic_string<char> > >'
Ich bin nicht immer diese Fehlermeldung, wenn ich eine reguläre Karte wie map<pair<string, string>, int>
statt einer unordered_map.
Ist es nicht möglich pair
als Schlüssel im unsortierten Karten?
InformationsquelleAutor der Frage Mapplet | 2015-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine geeignete hash-Funktion für die Schlüssel zu geben. Ein einfaches Beispiel:
Dies funktionieren wird, aber nicht die besten hash-Eigenschaften†. Möchten Sie vielleicht einen Blick auf so etwas wie
boost.hash_combine
für höhere Qualität der Ergebnisse erzielt, wenn man die hashes.Für die Reale Welt verwenden: Boost bietet auch die Funktion set
hash_value
die bereits eine hash-Funktion fürstd::pair
sowiestd::tuple
und die meisten standard-Containern.†genauer, es produziert zu viele Kollisionen. E. g., jedes symmetrische paar wird in der hash auf 0 und Paare, die sich nur durch permutation haben den gleichen hash. Dies ist wahrscheinlich gut für die Programmierung übung, aber kann schwer verletzt die Leistung der realen Welt code.
InformationsquelleAutor der Antwort Baum mit Augen
Meine bevorzugte Methode, dieses problem zu lösen ist, um eine
key
Funktion, verwandelt sich das paar in eine eindeutige ganze Zahl (oder jede hashable-Datentyp). Dieser Schlüssel ist nicht die Raute-Taste. Es ist die eindeutige ID der paar Daten, die dann optimal hashed durch dieunordered_map
. Zum Beispiel, Sie wollten, definieren Sie eineunordered_map
von der ArtSind und Sie verwenden möchten
Map[make_pair(i,j)]=value
oderMap.find(make_pair(i,j))
zu betreiben, auf der Karte. Dann müssen Sie dem system mitteilen, wie Sie hash ein paar von ganzen zahlenmake_pair(i,j)
. Anstatt, dass wir definieren können,und ändern Sie dann die Art der Karte, um
Wir können jetzt
Map[key(i,j)]=value
oderMap.find(key(i,j))
zu betreiben, auf der Karte. Jedermake_pair
wird nun zum Aufruf der inline -key
Funktion.Diese Methode garantiert, dass der key wird optimal gehasht, weil jetzt die hashing-Teil erledigt das system, die wählen immer die interne hash-Tabelle Größe prime, um sicherzustellen, dass jeder Eimer ist gleich wahrscheinlich sind. Aber Sie haben, um sich 100% sicher, dass die
key
ist einzigartig für jedes paar ist, d.h., keine zwei unterschiedliche Paare haben den gleichen Schlüssel, oder es kann sehr schwierig sein, bugs zu finden.InformationsquelleAutor der Antwort Zhuoran He
Als Ihre Zusammenstellung Fehler zeigt, dass es keine gültige Instanziierung
std::hash<std::pair<std::string, std::string>>
in Ihrem std-namespace.Laut meinem compiler:
Können Sie Ihre eigene Spezialisierung für
std::hash<Vote>
wie folgt:InformationsquelleAutor der Antwort bku_drytt
Für die pair-Taste können wir die Verwendung von boost-pair-hash-Funktion:
Ebenso können wir die Verwendung von boost-hash für Vektoren,
InformationsquelleAutor der Antwort Felix Guo