Проблемы с созданием пользовательской хеш-функции unordered_map?

Я хотел создать пользовательскую хэш-функцию для неупорядоченной карты. Я нашел этот вопрос: С++ 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’

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


person user1871869    schedule 05.02.2015    source источник
comment
Какой компилятор? И gcc, и clang принимают ваше первое определение.   -  person Praetorian    schedule 06.02.2015
comment
Я пытаюсь написать программу с использованием MPI, поэтому я использовал компилятор mpicxx @Praetorian.   -  person user1871869    schedule 06.02.2015
comment
Посмотрите, скомпилирует ли он код, на который я ссылался, если нет, это может быть проблема с этим компилятором.   -  person Praetorian    schedule 06.02.2015
comment
@Praetorian, что интересно, компилируется. Я не думаю, что у меня есть что-то отличное от того, что вы написали в коде, который вы связали.   -  person user1871869    schedule 06.02.2015
comment
@Praetorian А, неважно. Я нашел проблему. Это было где-то еще в моем коде. Я извиняюсь и благодарю вас за то, что помогли мне с этим.   -  person user1871869    schedule 06.02.2015
comment
Возможно, недостаточно места для ›› в закрывающих скобках шаблона?   -  person fche    schedule 07.08.2015


Ответы (1)


Этот код компилируется просто отлично:

#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;
}

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

person David Schwartz    schedule 05.02.2015