• unordered_map的哈希HASH重载——举例unordered_map与pair联合使用


    有些时候,为了图省力,我们没准会这样的调用一个函数

    unordered_map< pair<int, int>, int > mp;
    

    但是很显然的是,这样的写法是会报错的,因为pair还没有HASH键值。

    error: call to implicitly-deleted default constructor of 'std::__1::hash<std::__1::pair<int, int> >'
            : _Hash() {}
    

    会返回这样的一个报错,看到这里的hash和pair就应该知道了,我们的pair还没有hash值!

    改良

    struct hashfunc
    {
        template<typename T, typename U>
        size_t operator() (const pair<T, U> &i) const
        {
            return hash<T>()(i.first) ^ hash<U>()(i.second);
        }
    };
    unordered_map< pair<int, int>, int , hashfunc > mp;
    

    我们自己手动做一个hash就可以继续使用unordered_map了。 

    同理,vector也可以如此:

     1 struct vector_hash {
     2     template <typename T>
     3     size_t operator()(const T & p) const {
     4         hash<int> hasher;
     5         size_t seed = 0;
     6         for (int i : p) {
     7             seed ^= hasher(i);
     8             //or seed ^= hasher(i) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
     9         }
    10         return seed;
    11     }
    12 };    

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/13932784.html

  • 相关阅读:
    ping 原理与ICMP协议
    ARP详解
    TCP,UDP,IP数据包的大小限制
    Java7--try
    递归,尾递归,回溯
    OLEDB数据源
    hexo next主题为博客添加分享功能
    Windows数据库编程接口简介
    2017总结与2018规划
    为 MariaDB 配置远程访问权限
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/13932784.html
Copyright © 2020-2023  润新知