Junior — Middle
Milyen speciális predikátumokat kell meghatározni a felhasználói típusok std::unordered_map-ban való használatához?
sobes.tech MI
Válasz az MI-től
Az std::unordered_map egyedi típusok használatához két dolgot kell meghatározni:
-
Hash függvény — egy objektum vagy függvény, amely elfogadja a kulcsot, és visszaadja a hash értékét (egész szám). Ez általában az
std::hashsablon specializálásával történik a típusodhoz, vagy saját hash függvény átadásával sablon paraméterként. -
Egyenlőség operátor — az
operator==operátort kell definiálni a típusodhoz, hogy azunordered_mapössze tudja hasonlítani a kulcsokat, és meg tudja állapítani, hogy egyenlőek-e.
Példa:
#include <unordered_map>
#include <string>
struct Key {
int id;
std::string name;
bool operator==(const Key& other) const {
return id == other.id && name == other.name;
}
};
namespace std {
template<> struct hash<Key> {
size_t operator()(const Key& k) const {
return hash<int>()(k.id) ^ (hash<std::string>()(k.name) << 1);
}
};
}
int main() {
std::unordered_map<Key, int> map;
map[{1, "test"}] = 42;
}
Ezek nélkül a meghatározások nélkül az unordered_map nem tudja helyesen tárolni és keresni a saját típusú kulcsokat tartalmazó elemeket.