[英]In the C++0x standard there will be unordered_map, how does this compare to boosts unordered_map?
哪個更有效率? 有沒有好的基准測試?
C ++ 11的std :: unordered_map規范類似於boost :: unordered_map,它基於tr1 :: unordered_map。 話雖如此,但存在一些細微差別。 在C ++ 11中添加rvalue引用會導致增加emplace和emplace_hint函數,這些函數可能對性能有用。
C ++ 11現在已經廣泛實現,因此您應該可以使用開箱即用的std :: unordered_map。 C ++ 14沒有顯着改變它,C ++ 17將(可能)添加insert_or_assign和try_emplace成員函數。
在c ++ 0x最新標准草案n3225中,有一節23.6.1類模板unordered_map。
所以它已經存在了。
基於boost one提出了C ++ 0x unordered_map。 Boost庫本身也有一個命名空間tr1 :: unordered_map,它共享自己的boost :: unordered_map的實現。
如果你想比較(當然你不需要比較boost和boost),我認為其他幾個編譯器,包括microsoft visual studio 2010和gcc,都有自己的unordered_map實現。 您可以通過假設它們位於命名空間tr1下來使用它們。
#include <unordered_map>
...
std::tr1::unordered_map<...>
我還不知道任何基准測試,但我認為在這個早期,任何基准測試都沒有意義,因為當真正的標准最終確定並且更多人將使用該庫時,編譯器實現者肯定會優化他們自己的實現。
還沒有提到的一個小問題是, std::hash
函數只需要能夠計算內置類型和字符串(以及其他一些類型)的哈希值。 boost::hash
函數可以計算更復雜對象的散列,例如pair
和tuple
。 boost還有一個hash_combine
函數,可以幫助為用戶定義的類型創建哈希值。
這意味着std::unordered_set< pair<int, int> >
不會編譯,但boost::unordered_set< pair<int, int> >
將會。
如果需要,您可以將boost::hash
與std::unordered_*
使用。
(參考: 圖書館擴展技術報告問題清單中的第6.18項。)
這取決於實施和相關數據集。 當我在博客文章中使用unordered_map
,我發現VS10的std::unordered_map
boost::unordered_map
對於我使用的輸入 (比如我沒有建立徹底的基准測試),比boost::unordered_map
更糟糕。 理論上認為應該沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.