2015-02-05 6 views
0

Я хотел создать пользовательскую хэш-функцию для неупорядоченной карты. Я нашел этот вопрос: C++ unordered_map fail when used with a vector as key и обнаружил, что если вы используете вектор в качестве ключа на неупорядоченной карте, вам нужно создать собственную хэш-функцию. Я экспериментировал копирование хэш-функции записывается в виде так:Не удается создать пользовательскую хэш-функцию unordered_map?

template <typename Container> 
struct container_hash { 
    std::size_t operator()(Container const& c) const { 
     return boost::hash_range(c.begin(), c.end()); 
    } 
}; 

Но когда я пытаюсь создать unordered_map с моими ключами в качестве вектора целых чисел, как так :,

unordered_map<vector<int>, int, container_hash<vector<int>>> hash; 

Я получаю вопрос о том, что :

error: declaration of ‘struct std::hash<std::vector<int> >’ 

Я пробовал другие способы включения функции container_hash в реализации моего unordered_map, пытаясь вещи, как

unordered_map<vector<int>, int, container_hash> hash; 

Но опять-таки я получаю другую ошибку, говоря:

type/value mismatch at argument 3 in template parameter list for ‘template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> class std::unordered_map’ 

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

+0

Какой компилятор? И gcc и clang [accept] (http://coliru.stacked-crooked.com/a/e4988e4aad76243f) ваше первое определение. – Praetorian

+0

Я пытаюсь написать программу с использованием MPI, поэтому я использовал компилятор mpicxx @Praetorian – user1871869

+0

Посмотрите, скомпилирует ли он код, с которым я связан, если это не проблема с этим компилятором. – Praetorian

ответ

1

Этот код compiles just fine:

#include <vector> 
#include <boost/unordered_map.hpp> 

template <typename Container> 
struct container_hash { 
    std::size_t operator()(Container const& c) const { 
    return boost::hash_range(c.begin(), c.end()); 
    } 
}; 

int main() 
{ 
    boost::unordered_map 
     <std::vector <int>, int, 
     container_hash <std::vector <int> > > foo; 
    return 0; 
} 

Ваша проблема, скорее всего, в другом месте.

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

  • Нет связанных вопросов^_^