![](/img/trans.png)
[英]unordered_map vs vector + custom hashing for small number of elements
[英]map vs unordered_map for few elements
我試圖在map
和unordered_map
之間選擇以下用例:
map
的關鍵是指針。 最常見的用例是地圖中將有一個元素。 通常,地圖中的最大元素數小於10.地圖經常被訪問,速度是最重要的因素。 對地圖的更改很少發生。
雖然測量速度顯然是正確的方法,但這個代碼將在幾個平台上使用,所以我試圖創建一個通用的經驗法則,根據元素的數量在map
和unordered_map
之間進行選擇。 我在這里看到一些帖子暗示std :: map對於少數元素可能更快,但沒有給出“小”的定義。
是否有基於元素數量在何時根據map
和unordered_map
進行選擇的經驗法則? 另一種數據結構(例如通過vector
線性搜索)是否更好?
在你總是需要測量以便找出在性能方面更合適的前提下,如果所有這些都是真的:
然后我會說你最好把你的元素放在一個std::vector
然后對你所有的元素進行一次簡單的迭代,找到你正在尋找的元素。
std::vector
將在連續的內存區域中分配其元素,因此緩存局部性可能會為您提供更高的性能 - 在緩存未命中之后從主內存獲取緩存行所需的時間至少為一個數量級高於訪問CPU緩存所需的時間。
非常有趣的是,看起來Boost的flat_map
非常適合您的用例(由Praetorian提供 ):
flat_map
類似於std::map
但它實現為有序向量。 ( 來自在線文檔 )
因此,如果您使用Boost是一個選項,您可能想嘗試這個。
我相信你的10個元素或更少的元素,通常只有一個線性搜索未分類的矢量將是最好的。 但是,根據使用的散列算法,unordered_map可能會更快。
你應該很容易進行基准測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.