Функция хеширования unordered_map c ++

Мне нужно определить unordered_map как unordered_map<pair, *Foo> , что такое синтаксис для определения и передачи hash и equal функций этой карте?

Я пробовал передать ему этот объект:

 class pairHash{ public: long operator()(const pair &k) const{ return k.first * 100 + k.second; } }; 

и не повезло:

 unordered_map<pair, int> map = unordered_map<pair, int>(1, *(new pairHash())); 

У меня нет идеи, что означает size_type_Buskets поэтому я дал ей 1 . Каков правильный способ сделать это? Благодарю.

    Это неудачное упущение в C ++ 11; У Boost есть ответ с точки зрения hash_combine . Не стесняйтесь просто вставлять их из них! Вот как я hash-пары:

     template  inline void hash_combine(std::size_t & seed, const T & v) { std::hash hasher; seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } namespace std { template struct hash> { inline size_t operator()(const pair & v) const { size_t seed = 0; ::hash_combine(seed, v.first); ::hash_combine(seed, v.second); return seed; } }; } 

    Вы можете использовать hash_combine в качестве основы для многих других вещей, таких как кортежи и диапазоны, поэтому вы можете hashировать весь (упорядоченный) контейнер, например, если каждый член индивидуально хешируется.

    Теперь вы можете просто объявить новую карту:

     std::unordered_map, my_mapped_type> mymap; 

    Если вы хотите использовать свой хорватский hash (который не имеет хороших статистических свойств), вы должны явно указать параметры шаблона:

     std::unordered_map, int, pairHash> yourmap; 

    Обратите внимание, что нет необходимости указывать копию хешерного объекта, поскольку по умолчанию используется значение по умолчанию – постройте один для вас.

    Если вам хорошо с использованием Boost, более чистым решением будет полагаться на реализацию Boost hash-функции для пар (что на самом деле делает именно то, что объясняет kerrek-sb в своем ответе). Поэтому все, что вам нужно сделать, это:

     #include  #include  using namespace std; using namespace boost; unordered_map, int, hash>> table; 

    Тип возвращаемого значения hash-функции должен быть size_t , но не long (хотя это не является причиной ошибки). Неправильный синтаксис, который вы указали для предоставления пользовательской hash-функции.

    Вам также необходимо предоставить равный предикат, чтобы сделать работу выше.

     #include  #include  using namespace std; class pairHash{ public: size_t operator()(const pair &k) const{ return k.first * 100 + k.second; } }; struct pairEquals : binary_function&, const pair&, bool> { result_type operator()( first_argument_type lhs, second_argument_type rhs ) const { return (lhs.first == rhs.first) && (lhs.second == rhs.second); } }; int main() { unordered_map, int, pairHash, pairEquals> myMap; myMap[make_pair(10,20)] = 100; myMap.insert( make_pair(make_pair(100,200), 1000) ); } 

    РЕДАКТИРОВАТЬ:
    Вам не нужно определять равный предикат, поскольку operator== определен для std::pair и он делает именно то, что я сделал в pairEquals . Вам понадобится pairEquals определение pairEquals если вы ожидаете, что сравнение будет выполнено по-другому.

    Давайте будем гением компьютера.