2015-08-31 2 views
3

Моей линии:Нет ошибке согласования вызова для unordered_map

unordered_map < pair<long long,long long>, long long> myMap; 

и ошибки:

error: no matching function for call to 'std::unordered_map<std::pair<long long int, long long int>, long long int>::unordered_map()' 

кода, который воспроизводит ошибку:

#include <math.h> 
#include <stdio.h> 
#include <vector> 
#include <algorithm> 
#include <unordered_map> 
#include <utility> 
using namespace std; 

unordered_map < pair<long long,long long>, long long> myMap; 

int main() { 
    return 0; 
} 
+0

Вы '#include ' и '#include '? – CoryKramer

+0

Включено обе, да. –

+4

Пожалуйста, включите копию минимального рабочего примера вашего кода, чтобы помочь людям лучше диагностировать вашу проблему. – 7VoltCrayon

ответ

5

std::unordered_map не требуется хэш-функтор в порядке делать что-либо. По умолчанию этот хэш-функтор равен std::hash<Key>, но стандарт предоставляет только специализированные возможности для интегральных типов и указателей. std::pair<long long, long long> не так, так что компилятор сообщает вам, что вы не можете создать экземпляр unordered_map, потому что его хэш-функтор плохо сформирован.

Что вам нужно сделать, это предоставить свои собственные. Например, здесь наихудший возможный хеш-функтор:

struct AlwaysZero { 
    size_t operator()(pair<long long, long long> const&) const { 
     return 0; 
    } 
}; 

unordered_map < pair<long long,long long>, long long, AlwaysZero> myMap; 

Это компилируется. Это будет также ужасно. Вы можете проверить boost::hash_combine, чтобы получить представление о том, как правильно писать гораздо лучший хеш.

+0

Возможно, я задаю вопрос XY. Есть ли лучший способ сделать поиск двумя переменными? Я в основном пытаюсь создать карту, где я ее кормлю (a, b), и она возвращает c и максимально эффективно минимизирует общее время выполнения. –

+0

Я также нахожу это странным, потому что использование пар работает с картой, но не unordered_map –

+0

@ user64283 Наличие «пары » для ключа звучит разумно для меня, если это то, что вы делаете. Ваша проблема в том, что стандартная библиотека по умолчанию не поддерживает эту стандартную библиотеку. – Barry

Смежные вопросы