Middle
Šta treba uraditi da bi se sačuvala struktura u unordered_map?
sobes.tech АИ
Одговор од АИ
Да бисте сачували структуру као кључ у std::unordered_map, морате пружити:
- Функцију хеширања (hash function): Пронађе хеш вредност за инстанцу структуре.
- Оператор за поређење на равност (
operator==): Поређује две инстанце структуре по равности.
Постоји неколико начина да пружите ове елементе:
-
Преоптеретити
operator==унутар структуре и специјализоватиstd::hashза вашу структуру. Ово је најчешћи и препоручени приступ.#include <unordered_map> #include <string> #include <functional> struct MyStruct { int id; std::string name; bool operator==(const MyStruct& other) const { return id == other.id && name == other.name; } }; // Специјализација std::hash за MyStruct namespace std { template <> struct hash<MyStruct> { size_t operator()(const MyStruct& obj) const { size_t h1 = hash<int>()(obj.id); size_t h2 = hash<std::string>()(obj.name); return h1 ^ (h2 << 1); } }; } // Пример коришћења у main int main() { std::unordered_map<MyStruct, int> my_map; MyStruct key1 = {1, "Alice"}; MyStruct key2 = {2, "Bob"}; MyStruct key3 = {1, "Alice"}; // еkvивалентан key1 my_map[key1] = 10; my_map[key2] = 20; if (my_map.count(key3)) { // my_map[key3] ће дати 10 } return 0; } -
Пружити функције хеширања и поређења као одвојене параметре шаблона приликом објаве
unordered_map. Мање је згодно ако често користите структуру као кључ, јер морате у сваком случају да наведете типове компаратора и хешера.#include <unordered_map> #include <string> #include <functional> struct MyStruct { int id; std::string name; }; // Одвојена функција хеширања struct MyStructHash { size_t operator()(const MyStruct& obj) const { size_t h1 = std::hash<int>()(obj.id); size_t h2 = std::hash<std::string>()(obj.name); return h1 ^ (h2 << 1); } }; // Одвојена функција поређења (или функтор) struct MyStructEqual { bool operator()(const MyStruct& lhs, const MyStruct& rhs) const { return lhs.id == rhs.id && lhs.name == rhs.name; } }; // Пример коришћења у main int main() { std::unordered_map<MyStruct, int, MyStructHash, MyStructEqual> my_map; MyStruct key1 = {1, "Alice"}; MyStruct key2 = {2, "Bob"}; my_map[key1] = 10; my_map[key2] = 20; return 0; }
Важно:
- Коректност hash функције: За сваки пар кључева
aиb, ако јеa == b, ондаhash(a)мора бити једнакоhash(b). Обратна тврдња није обавезна (можу се јавити колизије). - Квалитет hash функције: Добра hash функција равномерно распоређује вредности за различите кључеве, минимизирајући колизије и побољшавајући перформансе (
O(1)у просеку). - Константност: Оператори поређења и hash функција треба да буду
const, јер не смеју мењати објекат кључа.