Junior — Middle
Aké špeciálne predikáty je potrebné definovať na použitie vlastných typov v std::unordered_map?
sobes.tech AI
Odpoveď od AI
Ak chcete použiť vlastné typy v std::unordered_map, musíte definovať dve veci:
-
Hashovaciu funkciu — objekt alebo funkciu, ktorá prijme kľúč a vráti jeho hash (celé číslo). Toto sa zvyčajne robí špecializáciou šablóny
std::hashpre váš typ alebo odovzdaním vlastnej hash funkcie ako parametra šablóny. -
Operátor porovnania rovnosti — musí byť definovaný operátor
operator==pre váš typ, abyunordered_mapmohla porovnávať kľúče a určiť, či sú rovnaké.
Príklad:
#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;
}
Bez týchto definícií unordered_map nemôže správne ukladať a vyhľadávať prvky s vlastnými typmi kľúčov.