2012-10-17 71 views
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函數?

回答

1

你已經做得很好了。哈希函數的基本規則是:

  1. 如果x = y然後hash(x) = hash(y)
  2. 如果x != y然後hash(x) != hash(y)(儘可能經常)。這不是一個嚴格的規則,但它越好,散列表的性能就越好。理想情況下,輸出將顯示爲隨機的。

你的工作方式,因爲如果兩個迭代器,iaib是相等的(指同一節點),其內部指針,ia.iib.i將是相等的。這需要處理規則1.然後在這些指針上使用內置的散列函數; Qt爲你處理規則2。

乾杯!