簡體   English   中英

在C ++ 0x標准中會有unordered_map,這與boost unordered_map相比如何?

[英]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函數可以計算更復雜對象的散列,例如pairtuple boost還有一個hash_combine函數,可以幫助為用戶定義的類型創建哈希值。

這意味着std::unordered_set< pair<int, int> >不會編譯,但boost::unordered_set< pair<int, int> >將會。

如果需要,您可以將boost::hashstd::unordered_*使用。

(參考: 圖書館擴展技術報告問題清單第6.18項。)

這取決於實施和相關數據集。 當我在博客文章中使用unordered_map ,我發現VS10的std::unordered_map boost::unordered_map 對於我使用的輸入 (比如我沒有建立徹底的基准測試),比boost::unordered_map更糟糕。 理論上認為應該沒有區別。

暫無
暫無

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

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