Я хочу создать 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.
вот подробная картина:
как я могу избежать этого? заранее спасибо
Это не проблема с функцией хеширования, это проблема с равенством char*
«S. Вы полагаетесь на сравнение указателей, и вы можете видеть из переменных наблюдения отладчика, указатели различных «временных» литералов имеют разные местоположения и, следовательно, не равны.
Вам нужно определить функтор равенства, который фактически сравнивает строки, и использовать его с unordered_map
,
Или вместо использования char*
в качестве вашего ключа используйте std::string
и вообще избежать этой проблемы.
Других решений пока нет …