Witam
- Nie wiem jak dodac własną funkcje hashującą do unordered_seta bądź mapy. Np. takie coś jak niżej powinno zadziałac a nie działa. Hash "10" w obu przypadkach jest taki sam jakaś milionowa liczba, nie wywołuje mi się w ogóle operator (). CO może być poniżej źle?
class HashClass
{
public:
size_t operator()(const string& str) const
{
cout << "hash dla " << str << " " <<std::stoi(str) << endl;
return std::stoi(str); //example "10" -> hash = 10
}
};
unordered_set<string> zbior2{ "7", "3", "9", "10", "1" };
printIter(zbior2.begin(), zbior2.end());
unordered_set<string>::hasher funkcjaHashujaca = zbior2.hash_function();
cout << funkcjaHashujaca("10") << endl;
unordered_set<string, HashClass> zbior3({ "7", "3", "9", "10", "1" }, 31, HashClass()); //31 - minimum number of buckets, there will be 32
printIter(zbior3.begin(), zbior3.end());
unordered_set<string, HashClass>::hasher funkcjaHashujaca2 = zbior3.hash_function();
cout << funkcjaHashujaca2("10") << endl;
- Nie wiem też jaki jest związek między indeksem bucketa a wartości zwracanej przez funckję hashującą. Powyżej hash dla "10" w obu przypadkach ma wartość jakąś bardzo dużą 4 miliony coś. Na pewno funkcja hashujaca nie zwraca indeksu bucketa co można sprawdzic pętlą:
for (auto& x : zbior3)
cout << "hash value: " << HashClass()(x) << " => " << x << " bucket no " << zbior3.bucket(x) << endl;
cout << zbior3.bucket_count() << endl;
Co do drugiego problemu to boję się że na rozmowie kwalifikacyjnej rekrutujący każe uporządkować mi obiekty (tak po prostu jako sztuka dla sztuki bo wiadomo że ten kontener nie jest do tego) w unordered_mapie bez pisania jakichś skomplikowanych pętli for, tylko tak już przy kontruktorze i z powyższego wydaje się że sie nie da, że to kontener którego nie uporządkujemy bez jakiegoś większego kawałka kodu.