簡體   English   中英

何時應在 std::unordered_map/std::unordered_set 上使用 std::map/std::set?

[英]When std::map/std::set should be used over std::unordered_map/std::unordered_set?

正如在新標准中引入了 std::unordered_map/std::unordered_set 一樣,它使用 hash function 並且具有平均恆定的插入/刪除/獲取元素的復雜性,以防我們不需要以特定順序迭代集合,似乎沒有理由使用“舊”std::map/std::set? 或者當 std::map/std::set 是更好的選擇時,還有其他一些情況/原因? 就像他們是前任一樣。 更少的 memory 消耗,或者他們對“無序”版本的唯一優點是訂購?

它們是有序的,寫< us 比寫 hash 和相等更容易。

永遠不要低估易用性,因為 90% 的代碼對代碼性能的影響微乎其微。 將速度提高 10% 可以使用您為另一種類型編寫 hash 所花費的時間。

OTOH,一個好的 hash 組合器只寫一次,get-state-as-tie 使< , ==hash幾乎免費。

具有基於節點的操作的容器之間的拼接保證可能會更好,因為拼接到 hash map 不像良好的有序容器拼接那樣免費。 但我不確定。

最后,迭代器失效保證不同。 盲目地用無序的喵喵替換成熟的測試喵喵可能會產生錯誤。 也許地圖的失效特性對你來說是值得的。

std::set/std::mapstd::unordered_set/std::unordered_map用於非常不同的問題領域,並且不能相互替換。

  1. std::set/std::map用於問題圍繞元素順序移動並且元素訪問時間平均為 O(log n) 的情況下是可以接受的。 通過使用std::set/std::map還可以檢索其他信息,例如查找大於給定元素的元素數。

  2. std::unordered_set/std::unordered_map用於元素訪問在平均情況下必須具有 O(1) 時間復雜度且順序不重要的情況,例如,如果您想將 integer 鍵的元素保留在std::vector中,這意味着vec[10] = 10但這不是實際的方法,因為如果鍵非常非常大,例如一個鍵是20 ,另一個是50000 ,那么只保留兩個值一個大小為50001std::vector ,如果你使用std::set/std::map則元素訪問復雜度為 O(log n) 而不是 O(1)。 在這個問題中,使用了std::unordered_set/std::unordered_map ,它在平均情況下通過使用hashing而不分配大空間來提供 O(1) 恆定時間復雜度。

暫無
暫無

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

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