• unorder_map 自定义KEY


    1. boost::unorder_map 实现自定义KEY

     1 // boostLibTest.cpp : 定义控制台应用程序的入口点。
     2 //
     3 #include "stdafx.h"
     4 
     5 #include <boost/functional/hash.hpp>
     6 #include <boost/unordered_map.hpp>
     7 #include <iostream>
     8 #include <set>
     9 #include <map>
    10 #include <unordered_map>
    11 
    12 using namespace std;
    13 
    14     struct Test
    15     {
    16         int _id;
    17         string _name;
    18         set<int> _nums;
    19 
    20         Test(int id, string name, set<int> nums = set<int>()) :
    21             _id(id), _name(name), _nums(nums)
    22         {
    23         }
    24     };
    25 
    26     bool operator==(const Test& ts1, const Test& ts2)
    27     {
    28         return ts1._id == ts2._id && ts1._name == ts2._name && ts1._nums == ts2._nums;
    29     }
    30 
    31     size_t hash_value(const Test& test)
    32     {
    33         std::size_t seed = 0;
    34         boost::hash_combine(seed, std::hash_value(test._id));
    35         boost::hash_combine(seed, std::hash_value(test._name));
    36         for (auto& iter : test._nums){
    37             boost::hash_combine(seed, std::hash_value(iter));
    38         }
    39         return seed;
    40     }
    41 
    42 int _tmain(int argc, _TCHAR* argv[])
    43 {
    44     set<int> sets = {1,2,3,4,5};
    45     boost::unordered_map<Test, string> map;
    46     map.insert(make_pair(Test(1, "abc", sets), "123"));
    47     map.insert(make_pair(Test(2, "def", sets), "234"));
    48     map.insert(make_pair(Test(3, "egh", sets), "345"));
    49     map.insert(make_pair(Test(4, "ijk", sets), "456"));
    50     map.insert(make_pair(Test(5, "lmn", sets), "567"));
    51 
    52     auto iter = map.find(Test(3, "egh", sets));
    53     if (iter != map.end()){
    54         cout << "Find !" << endl;
    55     }
    56     else{
    57         cout << "Not Find !" << endl;
    58     }
    59 
    60     getchar();
    61     return 0;
    62 }

    输出结果为: Find !

    ===============================================================

    2. std::unorder_map 实现自定义KEY

     1 // boostLibTest.cpp : 定义控制台应用程序的入口点。
     2 //
     3 #include "stdafx.h"
     4 
     5 #include <boost/functional/hash.hpp>
     6 #include <boost/unordered_map.hpp>
     7 #include <iostream>
     8 #include <set>
     9 #include <map>
    10 #include <unordered_map>
    11 
    12 using namespace std;
    13 
    14     struct Test
    15     {
    16         int _id;
    17         string _name;
    18         set<int> _nums;
    19 
    20         Test(int id, string name, set<int> nums = set<int>()) :
    21             _id(id), _name(name), _nums(nums)
    22         {
    23         }
    24     };
    25 
    26     namespace std
    27     {
    28         template<>
    29         struct hash<Test>
    30             : public _Bitwise_hash < Test >
    31         {   // hash functor for RECT
    32         };
    33 
    34         inline bool operator == (const Test &ts1, const Test &ts2) _NOEXCEPT
    35         {
    36             return ts1._id == ts2._id && ts1._name == ts2._name && ts1._nums == ts2._nums;
    37         }
    38     }
    39 
    40 int _tmain(int argc, _TCHAR* argv[])
    41 {
    42     set<int> sets = {1,2,3,4,5};
    43     std::unordered_map<Test, string> map;
    44     map.insert(make_pair(Test(1, "abc", sets), "123"));
    45     map.insert(make_pair(Test(2, "def", sets), "234"));
    46     map.insert(make_pair(Test(3, "egh", sets), "345"));
    47     map.insert(make_pair(Test(4, "ijk", sets), "456"));
    48     map.insert(make_pair(Test(5, "lmn", sets), "567"));
    49 
    50     auto iter = map.find(Test(3, "egh", sets));
    51     if (iter != map.end()){
    52         cout << "Find !" << endl;
    53     }
    54     else{
    55         cout << "Not Find !" << endl;
    56     }
    57 
    58     getchar();
    59     return 0;
    60 }

    奇怪的地方来了,std的结果有时候是 Find ! 有时候是 Not Find !   

    没弄明白这个std::unorder_map怎么回事,我自己直接用了boost::unorder_map 

  • 相关阅读:
    JavaScript设计模式(策略模式)
    JavaScript设计模式(单例模式)
    react中数据持久化缓存redux-persist
    webpack编写一个plugin插件
    webpack自定义loader并发布
    Vue用递归实现一个消除输入框表情符的自定义directive
    Spring MVC表单防重复提交
    @Controller,@Service,@Repository,@Component详解
    Spring Enable*高级应用及原理
    Spring Aware容器感知技术
  • 原文地址:https://www.cnblogs.com/tyche116/p/9559404.html
Copyright © 2020-2023  润新知