Mat
13-10-2006, 16:53
Meine erste hash_map implementierung sieht so aus:
struct eqint
{
bool operator()(int d1, int d2) const
{
return d1 == d2;
}
};
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;
}
};
Class::Class()
{
hash_map<int, double, MyHash, eqint> hash;
hash[0] = 3.0;
hash[0] = 2.7;
hash[1] = 2.5;
hash[2] = 15.3;
std::cout << " -> " << hash[2] << std::endl;
std::cout << " -> " << hash[0] << std::endl;
}
funktioniert auch.
Allerdings habe ich eine frage zu hash_map. Ich will meine eigene hash funktion verwenden. Diese ist doch dafür zuständig dass der schklüssel errechnet wird mit dem ich dann in konstanter zeit das hash element bekomme.
Nun habe ich einen vektor mit double werten als zu vergleichendes element.
also wenn der vektor bereits mal verwendet wurde sollten gewisse daten unter dessen schlüssel (der sich irgendwie aus den elementen des vektors errrechnnet) im hash vorhanden sein.
Meine Frage ist nun: Wie soll ich denn aus den double werten eine hash-funktion generieren? Schließlich werde ich nie identische schlüssel bekommen ...denn wie wir wissen ist folgendes:
double a = 8.4;
if(a == 8.4)
....
so net möglich.
Muss ich da auch irgendwie gegen ne untere schranke testen? Oder hat jemand einen Vorschlag wie man aus einem vektor mit double werten einen einheitlichen schlüssel generiert? Müsste irgendwie auf int oder long kommen um die eindeutigkeit zu halten...
Zusätzlich würde mich interessieren wie ich in meinem beispiel das zeug auf vektoren als eingabe übertragen kann. Im moment läuft es ja nur für integer und double werte als daten.
Ich brauche etwas was als zu vergleichendes element ein vektor eben sit mit double werten (woraus sich der schlüssel berechnen lässt) und als daten dann z.B 3 vektoren. Letzteres wäre evtl. über ein struct möglich?
Für Hilfe und Ideen bin ich sehr sehr dankbar.
struct eqint
{
bool operator()(int d1, int d2) const
{
return d1 == d2;
}
};
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;
}
};
Class::Class()
{
hash_map<int, double, MyHash, eqint> hash;
hash[0] = 3.0;
hash[0] = 2.7;
hash[1] = 2.5;
hash[2] = 15.3;
std::cout << " -> " << hash[2] << std::endl;
std::cout << " -> " << hash[0] << std::endl;
}
funktioniert auch.
Allerdings habe ich eine frage zu hash_map. Ich will meine eigene hash funktion verwenden. Diese ist doch dafür zuständig dass der schklüssel errechnet wird mit dem ich dann in konstanter zeit das hash element bekomme.
Nun habe ich einen vektor mit double werten als zu vergleichendes element.
also wenn der vektor bereits mal verwendet wurde sollten gewisse daten unter dessen schlüssel (der sich irgendwie aus den elementen des vektors errrechnnet) im hash vorhanden sein.
Meine Frage ist nun: Wie soll ich denn aus den double werten eine hash-funktion generieren? Schließlich werde ich nie identische schlüssel bekommen ...denn wie wir wissen ist folgendes:
double a = 8.4;
if(a == 8.4)
....
so net möglich.
Muss ich da auch irgendwie gegen ne untere schranke testen? Oder hat jemand einen Vorschlag wie man aus einem vektor mit double werten einen einheitlichen schlüssel generiert? Müsste irgendwie auf int oder long kommen um die eindeutigkeit zu halten...
Zusätzlich würde mich interessieren wie ich in meinem beispiel das zeug auf vektoren als eingabe übertragen kann. Im moment läuft es ja nur für integer und double werte als daten.
Ich brauche etwas was als zu vergleichendes element ein vektor eben sit mit double werten (woraus sich der schlüssel berechnen lässt) und als daten dann z.B 3 vektoren. Letzteres wäre evtl. über ein struct möglich?
Für Hilfe und Ideen bin ich sehr sehr dankbar.