2013-07-13 39 views
2

std::unordered_map<int, int>應該比std :: map`更快嗎?我不關心順序,只是快速查找,所以我認爲我應該使用哈希表。但後來我想也許它會嘗試另外哈希我的密鑰或類似的東西(我不需要)?是否有意義使用std :: unordered_map <int, int>而不是std :: map <int, int>?

和一個相關的問題:我需要通過int鍵檢索int值。我應該使用unordered_map<int, int>還是unordered_set<pair<int, int> >(在這種情況下,我需要爲我的配對正確實現散列函數)?

回答

4

map<T,K>unordered_map<T,K>之間的區別在於第一個實現依賴於一棵樹,而第二個實現依賴於散列圖。

這意味着基本操作(get和set)的複雜性對於map是對數,而對於unordered_map是複數。

有在任何情況下其他方面:一個unordered_map可能需要在達到它的負載因數時的翻版(這需要時間和可以是不可預知的),而正常map不涉及這種問題。此外,unordered_map實現可以使用分隔鏈接與桶,所以如果它碰巧有很多碰撞,複雜性變得恆定+線性檢索的關鍵。

我建議你用一些與你需要的模式相似的數據對兩個結構進行基準測試,這將會使你的選擇。

因爲它已經實施,您不需要爲unordered_map定義您自己的hash<int>

+0

重點是,我已經提供散列值的散列表(我的密鑰是散列)。是否有意義? –

+0

不,你沒有準確地爲散列值提供散列值,除非它的容量是'2 <<(sizeof(int)* 8)',這樣每個int值都可以映射到它自己的單元格,但在這種情況下, int [2 <<(sizeof(int)* 8]'數組就足夠了,問題將與數據的緩存有關,而不是數據結構的性能 – Jack

+0

當然,我現在看到了,謝謝。 –

相關問題