Вставка элемента в unordered_map дает ошибку

Я определил unordered_map как это

struct pht {
  pht(int t, vector<bool> pat) 
: tag(t), pattern(32) {}
private:
  int tag;
  vector<bool> pattern;
};

unordered_map< pair<int, int>, pht > predictor;

int main()
{
  int pc, addr, offset, tag;
  vector<bool> pat;
  srand(time(0));

  tag = 1000; pc = 100; offset = 10; 
  for ( int i = 0; i < 32; i++ ) 
  pat.push_back( rand() % 2 );
  predictor.insert(make_pair( make_pair(pc, offset), pht(tag, pat) ) );
  return 0;
}

Однако я получаю эту ошибку:

(ОБНОВЛЕНО)

error C2440: 'type cast' : cannot convert from 'const std::pair<_Ty1,_Ty2>' to 'size_t' 

как я могу это исправить?

1 ответ

Решение

Сообщение об ошибке вводит в заблуждение; настоящая причина в том, что нет std::hash специализация для std::pair<int, int> что требуется unordered_map, Вы должны предоставить эту специализацию или (рекомендуется) создать unordered_map который указывает пользовательский хеш:

struct hash_pair {
    template <typename T, typename U>
    std::size_t operator ()(std::pair<T, U> const& p) const {
        using std::hash;
        return hash<T>()(p.first) ^ hash<T>()(p.second);
    }
};

А затем объявить карту как:

unordered_map<pair<int, int>, pht, hash_pair> predictor;
Другие вопросы по тегам