我有两个整数,我想创建一个哈希映射,将两个整数映射到另一个整数。
为了这样我创建了以下程序,但它给了我错误:
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
std::pair <int, int> var1;
var1=std::make_pair(10,20);
cout<<"\n var1.f="<<var1.first<<"\t 2."<<var1.second<<"\n";
std::unordered_map <std::pair <int,int>, int> yeah;
return 0;
}
有没有办法摆脱错误? 有没有办法以可扩展的方式做同样的事情?
错误:
n file included from /usr/local/gcc-4.8.1/include/c++/4.8.1/bits/hashtable.h:35:0,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/unordered_map:47,
from main.cpp:2:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/hashtable_policy.h: In instantiation of ‘struct std::__detail::_Hash_code_base<std::pair<int, int>, std::pair<const std::pair<int, int>, int>, std::__detail::_Select1st, std::hash<std::pair<int, int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>’:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/hashtable_policy.h:1402:10: required from ‘struct std::__detail::_Hashtable_base<std::pair<int, int>, std::pair<const std::pair<int, int>, int>, std::__detail::_Select1st, std::equal_to<std::pair<int, int> >, std::hash<std::pair<int, int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true> >’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/hashtable.h:174:11: required from ‘class std::_Hashtable<std::pair<int, int>, std::pair<const std::pair<int, int>, int>, std::allocator<std::pair<const std::pair<int, int>, int> >, std::__detail::_Select1st, std::equal_to<std::pair<int, int> >, std::hash<std::pair<int, int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/unordered_map.h:100:18: required from ‘class std::unordered_map<std::pair<int, int>, int>’
main.cpp:12:50: required from here
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type ‘struct std::hash<std::pair<int, int> >’
struct _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2,
^
In file included from /usr/local/gcc-4.8.1/include/c++/4.8.1/bits/basic_string.h:3033:0,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/string:52,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/bits/locale_classes.h:40,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/bits/ios_base.h:41,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/ios:42,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/ostream:38,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/iostream:39,
from main.cpp:1:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/functional_hash.h:58:12: error: declaration of ‘struct std::hash<std::pair<int, int> >’
struct hash;
^
In file included from /usr/local/gcc-4.8.1/include/c++/4.8.1/bits/hashtable.h:35:0,
from /usr/local/gcc-4.8.1/include/c++/4.8.1/unordered_map:47,
from main.cpp:2:
答案 0 :(得分:3)
我认为错误类似于&#34; C ++标准没有提供此类型的哈希值#34;?问题是,您在无序映射中用作键的任何内容都必须是可清除的,并且pair<int, int>
没有内置哈希函数。有几种可能性:
- 为pair<int, int>
编写自己的哈希,并将其用作unordered_map的第三个模板参数。 This post可以帮助解决这个问题。
- 请改用std::unordered_map<int, std::unordered_map<int, int>>
。当您执行操作时,请注意不要意外地创建内部地图的副本。
- 使用map
代替unordered_map
。这将为您提供对数操作而不是固定时间,但除非地图很大并且您每秒进行大量查找,否则您不会注意到差异。
编辑以响应您的修改:是的,这些错误消息的含义是什么,尽管他们并不像微软的编译器那样友好地说出来。 :)