Использование пары в качестве ключа для hash_map в Visual Studio

Попробуйте использовать пару в качестве значения ключа для hash_map в Visual Studio 2010.

Не удалось скомпилировать.

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

появилось сообщение об ошибке:

Ошибка 1 ошибка C2440: 'приведение типа': невозможно преобразовать из 'const std :: pair ‹_Ty1, _Ty2>' в 'size_t' c: \ program files \ microsoft visual studio 10.0 \ vc \ include \ xhash 34 1 testApplication1

Я знаю это, вероятно, потому, что hash_map не предоставляет специализацию для pair. Любой простой способ исправить это?


person user2030574    schedule 14.02.2013    source источник
comment
Хм, работает нормально с std::map, но не с std::unordered_map   -  person Benj    schedule 14.02.2013
comment
в Visual Studio 2010 - отбросьте этот hash_map и используйте правильный std::unordered_map. Хотя это все равно не решит вашу проблему. К сожалению, отсутствие хеш-функций для std::pair является одним из самых больших упущений в C ++ 11 (но хорошо, по крайней мере, они поняли через 15 лет, что хеш - это полезная структура данных).   -  person Christian Rau    schedule 14.02.2013


Ответы (2)


Вы должны написать свою собственную hash_compare - функцию для объекта, который вы используете в качестве ключа!

В вашем случае это std::pair<int,int>

посмотрите это сообщение - может быть, вам лучше реализовать собственный компаратор!

person jenseb    schedule 14.02.2013

Вот очень простой пример хеш-функтора pair<int,int>, он должен дать вам достаточно возможностей для реализации вашего собственного:

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;
}
person Benj    schedule 14.02.2013