unordered_map hash-Funktion in c++
Brauche ich zum definieren einer unordered_map wie diese unordered_map<pair<int, int>, *Foo>
was ist die syntax für die Definition und die übergabe eines hash
und equal
Funktionen zu dieser Karte?
Habe ich versucht, übergeben Sie dieses Objekt:
class pairHash{
public:
long operator()(const pair<int, int> &k) const{
return k.first * 100 + k.second;
}
};
und kein Glück:
unordered_map<pair<int, int>, int> map = unordered_map<pair<int, int>, int>(1,
*(new pairHash()));
Ich habe keine Ahnung, was die size_type_Buskets
bedeutet also gab ich es 1
.
Was ist der richtige Weg, es zu tun?
Danke.
InformationsquelleAutor der Frage Vladp | 2011-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine unglückliche Unterlassung in C++11; Boost hat die Antwort in Bezug auf
hash_combine
. Fühlen Sie sich frei, fügen Sie es aus! Hier ist, wie ich hash-Paare:Können Sie
hash_combine
als Grundlage für viele andere Dinge, wie Tupel und Bereiche, so könnte man hash eine ganze (bestellt) - container, zum Beispiel, wie lange jedes Mitglied ist individuell hashable.Jetzt können Sie nur deklarieren Sie eine neue map:
Wenn Sie verwenden möchten Ihre homebrew hasher (die hat noch nicht gute statistische Eigenschaften), müssen Sie die template-Parameter explizit:
Beachten Sie, dass es gibt keine Notwendigkeit, geben Sie eine Kopie der hasher-Objekt als default ist die Standard-Konstrukt eine für Sie.
InformationsquelleAutor der Antwort Kerrek SB
Wenn Sie sind in Ordnung mit der Verwendung von Boost, eine saubere Lösung ist angewiesen auf Erhöhung der Implementierung der hash-Funktion, für Paare (die in der Tat genau das tut, was kerrek-sb erklärt in seiner Antwort). Also alles, was Sie tun müssen, ist:
InformationsquelleAutor der Antwort Paul Baltescu
Den return-Typ der hash-Funktion sollte
size_t
nichtlong
(obwohl dies nicht die Ursache des Fehlers). Die syntax, die Sie gezeigt haben, für die Bereitstellung eine benutzerdefinierte hash-Funktion falsch ist.Werden Sie auch brauchen, um eine equal-Prädikat, um die oben genannten arbeiten ordnungsgemäß.
EDIT:
Sie brauchen nicht zu definieren, das gleiche Prädikat seit
operator==
definiert ist, für diestd::pair
und es tut genau das, was ich getan habe, inpairEquals
. Sie müssen nur diepairEquals
definition, wenn Sie erwarten, dass der Vergleich anders gemacht werden.InformationsquelleAutor der Antwort Praetorian