C ++: почему моя хеш-функция не используется для unordered_map & lt; char *, vector & lt; int & gt; & gt; за работой?

Я хочу создать unordered_map, который имеет char* в качестве ключа и vector<int> как value, Из предыдущих вопросов я узнал, что для char* предоставляется STL.

Я взял первую реализацию с этого сайта: http://www.cse.yorku.ca/~oz/hash.html

Так что мой main.cpp В файл я вставил следующий код:

namespace std
{
template<>
struct hash<char*>: public std::unary_function<char *, size_t>
{
size_t operator()(char * str) const{
size_t hash = 5381;
int c;

while(c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

return hash;

}
};
}

Затем я создал переменную unordered_map:

std::unordered_map<char *, vector<int>> test;

Однако, если я вставлю значение «temp» дважды, сделав это:

std::unordered_map<char *, vector<int>> test;
char *t1 = new char[5];
strcpy(t1, "temp");
char *t2 = new char[5];
strcpy(t2, "temp");
vector<int>& ptr = test[t1];
ptr.push_back(0);
vector<int>& ptr2 = test[t2];
ptr2.push_back(1);

последняя карта вместо того, чтобы иметь один ключ «temp» с вектором размера два, где каждый элемент вектора равен 0 или 1, у него есть два ключа с именем «temp» и в каждом ключе вектор размера 1.

вот подробная картина:
введите описание изображения здесь

как я могу избежать этого? заранее спасибо

1

Решение

Это не проблема с функцией хеширования, это проблема с равенством char*«S. Вы полагаетесь на сравнение указателей, и вы можете видеть из переменных наблюдения отладчика, указатели различных «временных» литералов имеют разные местоположения и, следовательно, не равны.

Вам нужно определить функтор равенства, который фактически сравнивает строки, и использовать его с unordered_map,

Или вместо использования char* в качестве вашего ключа используйте std::stringи вообще избежать этой проблемы.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]