簡體   English   中英

如何創建一個QSet的迭代器

[英]How to create a QSet of iterators

我正在嘗試做的是:

#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. 如果x = yhash(x) = hash(y)
  2. 如果x != yhash(x) != hash(y) (盡可能多)。 這不是嚴格的規則,但是遵循得越好,哈希表的性能就越好。 理想情況下,輸出將顯得隨機。

之所以ia.iia因為如果兩個迭代器iaib相等(指的是同一節點),則它們的內部指針ia.iib.i將相等。 這將處理規則1。然后,在這些指針上使用內置的哈希函數; Qt為您處理規則2。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM