2013-02-14 2 views
4

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

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

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 станд :: пары < _Ty1, _Ty2>' на 'size_t' C: \ Program файлы \ Microsoft Visual Studio 10.0 \ VC \ включить \ xhash 34 1 testApplication1

Я знаю, что это из-за probablly hash_map ddoesn't обеспечивают специализацию pair. Любой простой способ его исправить? спасибо

+0

Хм, хорошо работает с 'станд :: map' но не' зЬй: : unordered_map' – Benj

+0

* «под визуальную студию 2010» * - отбросьте этот 'hash_map' и используйте правильный' std :: unordered_map'. Хотя, это еще не решит вашу проблему. К сожалению, отсутствующие хеш-функции для 'std :: pair' являются одним из самых больших оплошностей в C++ 11 (но, по крайней мере, они поняли через 15 лет, что хэш - полезная структура данных). –

ответ

4

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

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

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

2

Вот очень простой пример 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; 
} 
Смежные вопросы