Hash-Funktion für ein Paar lange lang?
Ich brauche die Karte ein paar long long
zu einem double
aber ich bin mir nicht sicher, was hash-Funktion zu verwenden. Jedes paar besteht aus zwei zahlen, obwohl Sie in der Praxis wird in der Regel zahlen zwischen 0
und über 100
(aber auch das ist nicht garantiert).
Hier ist die tr1::unordered_map
Dokumentation. Ich begann so:
typedef long long Int;
typedef std::pair<Int, Int> IntPair;
struct IntPairHash {
size_t operator(const IntPair& p) const {
return ...; //how to hash the pair?
}
};
struct IntPairEqual {
bool operator(const IntPair& a, const IntPair& b) const {
return a.first == b.first
&& a.second == b.second;
}
};
tr1::unordered_map<IntPair, double, IntPairHash, IntPairEqual> myMap;
Im Allgemeinen, ich bin mir nie sicher, was hash-Funktion zu verwenden. Was ist ein guter Allzweck-hash-Funktion?
InformationsquelleAutor der Frage | 2009-04-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den natürlichen Weg, um hash-paar kombinieren Sie die hashes der Komponenten in irgendeiner Weise. Die am meisten einfache Weise ist nur mit xor:
Beachten Sie, dass diese hashes Paare wie (1,1) oder (2,2) alle auf null, so möchten Sie vielleicht noch etwas komplexer Weise zu kombinieren, die hashes von den teilen, je auf Ihre Daten. Boost macht etwas in dieser Art:
InformationsquelleAutor der Antwort sth
boost::hash form funktionale Bibliothek.
oder schreiben Sie Ihre eigenen. einfachste version = pair.erste * max_second_value + pair.zweite
InformationsquelleAutor der Antwort bayda
Einen Vorschlag: werfen Sie einen Blick auf dieser post SO: "Ich verstehe nicht,
std::tr1::unordered_map
".Auch, die Boost-Dokumentation auf Gleichheit von Prädikaten und Hash-Prädikate ist ein guter Ort zu (sowie diese Beispiel).
InformationsquelleAutor der Antwort dirkgently
Brauchen Sie wirklich einen hash-basierten Karte? Die übersichtskarte basiert auf einer binären Struktur funktioniert gut, solange die Komplexität garantiert, es macht die Arbeit für das problem, das Sie lösen müssen.
InformationsquelleAutor der Antwort lothar