2
的展示Qset
我所試圖做的是:如何創建迭代
#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
函數?