gpt4 book ai didi

C++:为什么我的 unordered_map> 哈希函数不起作用?

转载 作者:行者123 更新时间:2023-11-30 02:56:20 25 4
gpt4 key购买 nike

我想创建一个 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”键和一个大小为 2 的 vector ,其中 vector 的每个元素为 0 或 1,它有两个名为“temp”的键,每个键中有一个大小为 1 的 vector .

详细图片如下: enter image description here

如何避免这种情况发生?提前谢谢你

最佳答案

这不是散列函数的问题,而是 char* 是否相等的问题。您依赖于指针比较,并且您可以从调试器监视变量中看到,各种“临时”文字的指针具有不同的位置,因此不相等。

您需要定义一个实际进行字符串比较的相等仿函数,并将其与 unordered_map 一起使用。

或者,不使用 char* 作为键,而是使用 std::string,从而完全避免这个问题。

关于C++:为什么我的 unordered_map<char*, vector<int>> 哈希函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15665985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com