2010-07-22 88 views
1

假設程序以相同的方式運行多次。在每次運行中,相同的一組對象以相同的插入順序插入到QHash中;那麼QHash中的對象將被迭代。問題是這些對象是否會在程序的每次運行中以相同的順序迭代?Qt的QHash迭代順序是否可以在程序的多個相同運行之間重複?

+0

如果更改Qt版本會怎麼樣?那麼你將不得不重新測試你的假設,因爲你依賴的是沒有記錄的行爲。 – RedX 2012-07-20 15:45:36

回答

3

也許,但你不能絕對依靠它。

QHashQSet類似,要求用作鍵的任何類型都提供了將對象轉換爲散列碼的qHash函數的重載。在散列內部,項目按散列碼排序。通常,這種轉換爲散列碼的轉換將是穩定且確定的,因此對象將接收相同的散列碼,因此即使在運行之間也會以相同的順序排列。

但是,沒有什麼能夠阻止某人創建一個類型,輸出qHash依賴於某個值(例如對象中保存的指針地址),該值對於特定的運行將是常量,但在運行之間不一致。

0

如果使用的qHash重載保證在程序運行中返回相同的qHash值,那麼QHash迭代順序是否保證在不同的運行中保持相同?除了依賴qHash返回值,QHash是如何實現的(除了依賴qHash返回值)還有其他什麼可能導致QHash迭代次序在完全相同的一組對象(按相同順序插入)上跨程序運行發生變化?

+0

這應該是作爲我的答案評論,而不是答案本身。但是,迴應是Qt文檔調用'QHash'「無序」,所以沒有接口保證即使插入順序和「qHash」值相同,迭代順序也是一樣的。也就是說,如果你檢查源代碼,你會發現它將是相同的,並且可能會保持這種方式,因爲它實際上需要刻意的努力使它不能以這種方式工作。所以,答案是「實際上是的,理論上沒有」。 – 2010-07-22 19:28:57

0

引述the documentation

QHash是無序的,所以迭代器的序列不能被認爲是可預測的。如果需要按鍵排序,請使用QMap。

相關問題