Advertisement
devincpp

pair_as_the_key_of_map

Oct 25th, 2024 (edited)
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. #include <unordered_map>
  5.  
  6. using Pair = std::pair<int, int>;
  7.  
  8. struct PairHash {
  9.     size_t operator()(const Pair &a) const {
  10.         return (a.first << 8) + a.second;
  11.     }
  12. };
  13.  
  14. template <>
  15. struct std::hash<Pair>
  16. {
  17.     // const关键字是必须的
  18.     size_t operator()(const Pair &t) const
  19.     {
  20.         return t.first + t.second;
  21.     }
  22. };
  23.  
  24. int main()
  25. {
  26.     bool a1 = Pair{1, 2} < Pair{1, 3}; // true
  27.     bool a2 = Pair{1, 9} < Pair{2, 3}; // true
  28.     bool a3 = Pair{1, 2} == Pair{1, 2}; // true
  29.     std::cout << a1 << ", " << a2 << ", " << a3 << std::endl;
  30.  
  31.     // 1.std::pair 支持比较大小,因此std::map直接可以使用Pair作为key
  32.     std::map<Pair, std::string> map;
  33.     map.insert({{1, 2}, "AA"});
  34.  
  35.     // 2.std::pair 不支持hash函数,因此不能直接作为key
  36.     // std::unordered_map<Pair, std::string> hashmap; // error
  37.  
  38.     // 2.1)define hash function
  39.     // std::unordered_map<Pair, std::string, PairHash> hashmap1;
  40.     // hashmap1.insert({{1, 2}, "BB"});
  41.  
  42.     // 2.2)specialize template std::hash<T>
  43.     std::unordered_map<Pair, std::string> hashmap2;
  44.     hashmap2.insert({{1, 2}, "BB"});
  45.  
  46.     return 0;
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement