2

我想做的是:

#include <QVector>
#include <QLinkedList>
#include <QSet>

class MyType
{
//...
};

int main(int argc, char** argv)
{
    QVector<MyType> vector;
    QSet<QVector<MyType>::iterator> a;
    a.insert(vector.begin());          // This is fine

    QLinkedList<MyType> linkedList;
    QSet<QLinkedList<MyType>::iterator> b;
    b.insert(linkedList.begin());      // This does not compile

    return 0;
}

编译器消息是:

error: no matching function for call to 'qHash(const QLinkedList<MyType>::iterator&)'

我知道,前三行编译的原因是对于QVector,迭代器被定义为typedef T* iterator;但对于QLinkedList它是自定义类型。

我发现,QSet模板类是根据哈希表实现的。显然,可以评估指针的哈希函数,但不能评估自定义类型。

请问,你能告诉我,如何重载qHash我的程序编译的函数吗?我已经阅读了一些关于哈希表工作原理的基本信息,但我对这个主题缺乏信心。

我试图了解QLinkedList<T>::iterator. 似乎与QVector<T>::iterator. 它只是保存指向链表中节点的指针,而不是指向项目本身的指针。

class iterator
{
public:
   ...
   Node *i;
   ...
};

所以我尝试以这种方式定义函数:

uint qHash(QLinkedList<MyType>::iterator it)
{
    return qHash(it.i);
}

该程序已编译,但我对我的解决方案没有信心。我应该如何正确重载该qHash功能?

4

1 回答 1

1

你已经做得很好了。哈希函数的基本规则是:

  1. 如果x = y那么hash(x) = hash(y).
  2. 如果x != y那么hash(x) != hash(y)(尽可能频繁)。这不是一个严格的规则,但越是遵循它,哈希表的性能就越好。理想情况下,输出将随机出现。

您的方式有效,因为如果两个迭代器,iaandib相等(指同一个节点),它们的内部指针,ia.iandib.i将相等。这涉及到规则 1。然后您在这些指针上使用内置哈希函数;Qt 为您处理规则 2。

干杯!

于 2012-10-17T10:39:45.227 回答