c++ - 散列pair <pair <int,int>,pair <int,int >>的unordered_map

标签 c++ templates hash unordered-map

我定义了以下类型

typedef pair<int,int> point ;
typedef pair<int,int> fraction ; 
typedef pair<fraction,fraction> line ;
使用以下自定义哈希函数-
struct hash_pair { 
    template <class T1, class T2>
    size_t operator() (const pair<T1, T2> &pair) const
    {
        return hash<T1>()(pair.first) ^ hash<T2>()(pair.second);
    }
};
我声明了两个 map ,如下所示:
unordered_map<point, int, hash_pair> points ;
unordered_map<line, int, hash_pair> lines ;
我还分配了两个变量point pline l。当我执行points.find(p)时,它可以正常工作。但是,当我使用lines.find(l)时,我将获得无尽的错误行,如下所示:
solution.cpp: In instantiation of 'size_t hash_pair::operator()(const std::pair<_T1, _T2>&) const [with T1 = std::pair<int, int>; T2 = std::pair<int, int>; size_t = long unsigned int]':
/usr/include/c++/9.2.0/bits/hashtable_policy.h:1384:16:   required from 'std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2, std::__detail::_Default_ranged_hash, true>::__hash_code std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2, std::__detail::_Default_ranged_hash, true>::_M_hash_code(const _Key&) const [with _Key = std::pair<std::pair<int, int>, std::pair<int, int> >; _Value = std::pair<const std::pair<std::pair<int, int>, std::pair<int, int> >, int>; _ExtractKey = std::__detail::_Select1st; _H1 = hash_pair; _H2 = std::__detail::_Mod_range_hashing; std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2, std::__detail::_Default_ranged_hash, true>::__hash_code = long unsigned int]'
/usr/include/c++/9.2.0/bits/hashtable.h:1417:19:   required from 'std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::iterator std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::find(const key_type&) [with _Key = std::pair<std::pair<int, int>, std::pair<int, int> >; _Value = std::pair<const std::pair<std::pair<int, int>, std::pair<int, int> >, int>; _Alloc = std::allocator<std::pair<const std::pair<std::pair<int, int>, std::pair<int, int> >, int> >; _ExtractKey = std::__detail::_Select1st; _Equal = std::equal_to<std::pair<std::pair<int, int>, std::pair<int, int> > >; _H1 = hash_pair; _H2 = std::__detail::_Mod_range_hashing; _Hash = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, false, true>; std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::iterator = std::__detail::_Node_iterator<std::pair<const std::pair<std::pair<int, int>, std::pair<int, int> >, int>, false, true>; std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::key_type = std::pair<std::pair<int, int>, std::pair<int, int> >]'
/usr/include/c++/9.2.0/bits/unordered_map.h:921:29:   required from 'std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::find(const key_type&) [with _Key = std::pair<std::pair<int, int>, std::pair<int, int> >; _Tp = int; _Hash = hash_pair; _Pred = std::equal_to<std::pair<std::pair<int, int>, std::pair<int, int> > >; _Alloc = std::allocator<std::pair<const std::pair<std::pair<int, int>, std::pair<int, int> >, int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator = std::__detail::_Node_iterator<std::pair<const std::pair<std::pair<int, int>, std::pair<int, int> >, int>, false, true>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::pair<std::pair<int, int>, std::pair<int, int> >]'
solution.cpp:105:30:   required from here
solution.cpp:11:16: error: use of deleted function 'std::hash<std::pair<int, int> >::hash()'
   15 |         return hash<T1>()(pair.first) ^ hash<T2>()(pair.second);
      |   
lines.find(l)上标记了两个错误,return hash<T1>()(pair.first) ^ hash<T2>()(pair.second);上另一个错误
谁能帮我解决我如何定期对pair<pair<int,int>,pair<int,int>>使用unordered_map吗?谢谢!

最佳答案

处理嵌套对的最简单方法是递归并提供一个重载,当参数不是一对时,该重载将退出。例如:

struct hash_pair { 
    template <class T1, class T2>
    size_t operator() (const pair<T1, T2> &pair) const
    {
        return (*this)(pair.first) ^ (*this)(pair.second);
    }

    template <class T>
    size_t operator() (const T &v) const
    {
        return hash<T>()(v);
    }
};
(当然,简单的xor并不是散列一对的好方法。)

关于c++ - 散列pair <pair <int,int>,pair <int,int >>的unordered_map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62681583/

相关文章:

c++ - 类似函数的宏和奇怪的行为

templates - Joomla 模板无法识别

c++ - 存储和重新使用 decltype 值?

c# - 使用 SHA256 将字符串转换为 Guid 而不截断

MySQL分区。分区函数返回错误类型

c++ - 错误 C2653。在 C++ 中找不到类型或命名空间名称(存在引用)

c++ - 手动递增和递减 boost::shared_ptr?

c++ - 我做了什么?需要在模板类的方法中实例化派生类

algorithm - 查找包含所有不同输入字符串的连续子系列的最小长度

android - :libvlc:buildDebugARMv7 FAILED