5
votes

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?

2
Hmm, works ok with std::map but not std::unordered_mapBenj
"under visual studio 2010" - drop that hash_map and use a proper std::unordered_map. Though, this still won't solve your problem. Unfortunately missing hash functions for std::pair is one of the biggest oversights in C++11 (but Ok, at least they realized after 15 years that a hash is useful data structure).Christian Rau

2 Answers

4
votes

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!

3
votes

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;
}