Try to use pair as key value for hash_map under Visual Studio 2010.
Could not compile it.
int _tmain(int argc, _TCHAR* argv[])
{
hash_map <pair<int, int>, int> months;
months[pair<int, int>(2,3)] = 1;
int d;
cin >> d;
return 0;
}
got error message:
Error 1 error C2440: 'type cast' : cannot convert from 'const std::pair<_Ty1,_Ty2>' to 'size_t' c:\program files\microsoft visual studio 10.0\vc\include\xhash 34 1 testApplication1
I know it probably due to hash_map
doesn't provide a specialization for pair
. Any easy way to fix it?
Unordered Map does not contain a hash function for a pair like it has for int, string, etc, So if we want to hash a pair then we have to explicitly provide it with a hash function that can hash a pair.
So, you can use pair as a key in a map as follows: map<pair<int,string> , long> mp; mp.
However, std::pair is not hashable by default, so a simple snippet like the above would not work. There are many proposals online to define a pairhash class and explicitly specify it as the hash function as a template parameter to std::unordered_set and std::unordered_map . This is not a bad idea.
You have to write your own hash_compare
- function for the object you're using as key!
In your case is it std::pair<int,int>
look at this post - maybe you get a better idea implementing your own comparator!
Here's a very simple example of a pair<int,int>
hash functor, it should give you enough of a start to implement your own:
using namespace std;
class pair_hasher
{
public:
size_t operator()(const pair<int, int> & p) const
{
return p.first*100 + p.second*10000;
}
};
typedef unordered_map <pair<int, int>, int, pair_hasher> pair_map;
int _tmain(int argc, _TCHAR* argv[])
{
pair_map months;
pair<int, int> p = make_pair<int, int>(2,3);
months[p] = 1;
cout << months[p] << endl;
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With