Sgi: Hash_map mit eigener hash funktion
-
Hallo,
ich komme einfach nicht darauf wie ich die stl extension hash_map so für mich anwenden kann dass eine eigene hash funktion genutzt wird.Meine ersten versuche enden leider immer nur so:
struct MyHash { int operator()(const int key) const { int ret = 0; //for each e in vector ret = (ret * 31) + hash_i(key); std::cout << "Der key: " << ret << std::endl; return ret; } int hash_i(int x) const { return *(int*)&x; } }; struct HASH_DATA { std::vector<double> v1; std::vector<double> v2; int unit_vec_size; int unit_vec_row; }; Class::Class() { hash_map<int, HASH_DATA, MyHash, eqint> hash; }ich kann mir nix anderes vorstellen als die hash-funktion in einem hash zu realisieren...ich kann doch keine funktion direkt als typ angeben oder?
mache ich das so richtig?wenn ich z.B einen ganzen vektor übergeben wollen würde wäre das dann auch noch in Ordnung?
Zusätzlich würde mich interessieren ob es so in Ordnung wäre mehrere vektoren in einem struct zu speichern um dieses dann als daten im hash abzulegen?
Für Hilfestellung bin ich sehr dankbar.
-
Also was du in der hash_map ablegst bleibt alleine dir überlassen, der "Value" Teil ist komplett unkritisch. Vonwegen Fash-Funktion, probiers einfach aus. Als Typ würdest du dann in deinem Beispiel einfach "int (int)" oder "int (*)(int)" übergeben, und die Funktion müsstest du dann im Konstruktor übergeben (z.B. den Konstruktor "hash_map(size_type n, const hasher& h)").
Also z.B.
int my_hash(int key) { return key + (key >> 3); } hash_map<int, HASH_DATA, int (*)(int), eqint> hash(10, my_hash);Ist natürlich einfacher es in eine Klasse/Struct zu packen, dann musst du beim anlegen nicht immer die Funktion mitgeben.