我使用unordered_set来实现哈希表。我无法弄清楚如何使用find函数。运行此代码时,我一直遇到段错误。我知道它,因为find()没有找到一个元素,但它应该。我的问题是如何使用我提供的自定义哈希函数正确使用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;
}
};
答案 0 :(得分:1)
我知道为什么你找不到它应该的元素的根本原因。
您是否在Hash
函数中使用了staic variale。
将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;
}
}
答案 1 :(得分:0)
尝试将您自己的Pred评估程序添加为unordered_set的第三个参数。然后,您可以检查要比较的两个参数。在调用find之后验证你的迭代器不等于end()。