0

我正在使用 unordered_set 来实现哈希表。我不知道如何使用查找功能。运行此代码时,我不断收到段错误。我知道它是因为 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;
    }
};
4

2 回答 2

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再次调用,但你得到不同的结果,所以函数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;
    }
}
于 2013-11-26T03:01:28.650 回答
0

尝试添加您自己的 Pred 评估器作为 unordered_set 的第三个参数。然后,您可以检查正在比较的两个参数。还要在调用 find 后验证您的迭代器不等于 end()。

于 2013-11-26T02:51:22.643 回答