Middle
Чӣ бояд кард, то сохтори худро дар unordered_map нигоҳ доред?
sobes.tech AI
Ҷавоб аз AI
Барои нигоҳ доштани сохтор ҳамчун калид дар 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"}; // баробар бо key1 my_map[key1] = 10; my_map[key2] = 20; if (my_map.count(key3)) { // my_map[key3] ба 10 хоҳад буд } return 0; } -
Функсияҳои хеш ва муқоиса ҳамчун параметрҳои ҷудогона дар шablонро дар вақти эълон кардани
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); } }; // Функсияи муқоиса ҷудогона (ё functor) 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; }
Мавзӯъҳои муҳим:
- Дурустии функсияи хеш: Барои ҳар ду калид
aваb, агарa == b, пасhash(a)бояд баробар боhash(b)бошад. Баръакс, метавонад коллизияҳо рӯй диҳанд. - Сифати функсияи хеш: Функсияи хуби хеш ба таври баробар тақсим мекунад, то ки коллизияҳоро кам кунад ва иҷрои беҳтарро таъмин кунад (
O(1)дар миёна). - Константӣ: Операторҳои муқоиса ва функсияи хеш бояд
constбошанд, зеро онҳо набояд объекти калидро тағир диҳанд.