gpt4 book ai didi

c++ - unordered_set 中的哈希函数

转载 作者:行者123 更新时间:2023-11-28 07:16:15 28 4
gpt4 key购买 nike

我正在使用 unordered_set 来实现哈希表。我不知道如何使用查找功能。运行此代码时,我不断遇到段错误。我知道这是因为 find() 没有找到元素,但它应该找到。我的问题是如何通过我提供的自定义哈希函数正确使用查找?

unordered_set<Play*, Play::Hash> hashedData
unordered_set<Play*>::iterator got;

for (int i = 0; i < 10; ++i) {
got = hashedData.find(data[i]);

cout << (*got)->getSummary() << endl << endl;
}

数据只是一个

vector<Play*>

我的哈希函数是这样的

struct Hash {
size_t operator()(Play* const &x) const {
size_t t = 0;
static int hash = 0;

string u = x->getOffense();
string v = x->getDefence();
string w = x->getPlayDesc();

t = u.length() + v.length() + w.length();
t += hash;
++hash;

return t;
}
};

最佳答案

我知道您找不到它应该找到的元素的根本原因。

你用静态变量吗Hash功能。

改变你Hash像这样的功能:

struct Hash
{
size_t operator()(Play* const &x) const
{
size_t t = 0;
string u = x->getOffense();
string v = x->getDefence();
string w = x->getPlayDesc();

t = u.length() + v.length() + w.length();
return t;
}
};

这个函数有问题,当同一个对象A两次调用此函数,结果不同。因为你用了静态变量static int hash = 0; .所以在你构建 hashedData 的情况下, 函数 Hash使用 find 时调用一次函数,同一对象调用 Hash再次,但你得到了不同的结果,所以 funtiocn find返回 hashedData.end() .

当您调用 cout << (*got)->getSummary() << endl << endl; 时,你会遇到段错误。你应该这样做:

for (int i = 0; i < 10; ++i) 
{
got = hashedData.find(data[i]);
if (got != hashedData.end())
{
cout<<(*got)->getSummary()<<endl;
}
}

关于c++ - unordered_set 中的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20206982/

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