对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
Hashing an unordered_map of pair<pair<int,int>,pair<int,int>>
我定义了以下类型
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);
}
};
我声明了两张地图如下 -
unordered_map<point, int, hash_pair> points ;
unordered_map<line, int, hash_pair> lines ;
我还有两个变量point p
和line 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);
}
};
(当然,简单的异或不是散列一对的好方法。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'