将两个整数映射到另一个整数

时间:2014-04-24 12:40:08

标签: c++

我有两个整数,我想创建一个哈希映射,将两个整数映射到另一个整数。

为了这样我创建了以下程序,但它给了我错误:

#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:

1 个答案:

答案 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。这将为您提供对数操作而不是固定时间,但除非地图很大并且您每秒进行大量查找,否则您不会注意到差异。

编辑以响应您的修改:是的,这些错误消息的含义是什么,尽管他们并不像微软的编译器那样友好地说出来。 :)