2011-09-04 96 views
2

我需要將一組整數映射爲整數集。整數集之間的映射

首先,我想指出並不是所有可能的整數集都被考慮在內。 相反,我創建了應用程序將(永遠)使用的相關集 - 僅通過編程方式使用一次,並將其序列化爲二進制文件。我想構建一個QMap<QSet<int>, QSet<int> > setMap

稍後,應用程序構造另一組整數(通過用戶輸入),將其稱爲userSet並快速獲取setMap[userSet]

現在,問題是,QMap需要operator <定義爲關鍵類型,而明顯QSet<int>沒有一個。

我能做些什麼呢?

+0

你有多少套不同的套裝?蠻力是否發現了這個問題? – 2011-09-04 09:45:58

回答

1

如果這些集合是靜態的,則將它們加載到一個表格(QVector<QSet<int> >)中,並使用該表格集合中的索引作爲鍵和值(QMap<int,int>)而不是集合本身。

+0

這似乎是最優雅的解決方案,謝謝! – vedran

0

我會將這些集合轉換爲有序列表並映射它們(然後轉換回集合)。定義一個有序列表的比較運算符比一個集合更容易。當然,這對你來說可能太慢了。

您也可以使用哈希映射。

+0

哈希圖也是我的想法。但是,同樣,qHash()未針對QSet 實施。 – vedran

+0

你可以自己實現它。 –

1

您需要提供自己的超載<運算符。您可以參考QMap documentation中的Employee類示例。在你的情況,你需要提供這樣的函數:

bool operator<(const QSet<int> &first, const QSet<int> &second) 
{ 
    // your logic to compare the two sets 
} 
+0

我認爲比較兩組的邏輯是這裏的問題。 –

+0

QSet使用基於哈希表的實現,與使用平衡搜索樹的STL集合不同,並且對STL集合進行迭代以升序創建值。因此,如果您使用STL設置,則更容易進行比較。您可以簡單地切換到STL映射並設置...比​​較STL集合更簡單,因爲STL集合是一個已排序的容器。迭代STL集合將按照升序返回項目。但我不認爲這是可能的QSet。 –

+0

也許你可以這樣做:對於set1中的每個項目,驗證set2中存在所需的映射值或類似的東西。 –

1

你總是具有使地圖QString關鍵的可能性。訂購集合中的數字,以某種方式打印它們(使用任意分隔符),並開心。

+0

試過這個,它可以工作,但是很痛苦。無論如何,有用的想法!謝謝! – vedran