2010-12-11 40 views
5

哪種效率更高?有沒有好的基準測試結果?在C++ 0x標準中將會有unordered_map,這是如何比較來提升unordered_map的?

+2

我認爲的C++ 0x標準沒有規定的執行,所以這將是標杆相當困難。你真的要求特定的stl實現嗎? – lijie 2010-12-11 01:35:08

+1

而不是STL的無序映射從Boost導入到C++標準的功能之一? – Kos 2010-12-11 01:39:18

+2

C++ 0x unordered_map不基於boost庫,它基於在boost庫中的實現之前定義的TR1 unordered_map。 – hmuelner 2010-12-13 13:28:33

回答

5

C++ 11的std :: unordered_map規範類似於基於tr1 :: unordered_map的boost :: unordered_map。這就是說,有一些小的差異。在C++ 11中添加右值引用會導致添加可能對性能有用的emplace和emplace_hint函數。

C++ 11現已被廣泛實現,因此您應該能夠使用std :: unordered_map開箱即用。 C++ 14不會顯着改變它,C++ 17將(可能)添加insert_or_assign和try_emplace成員函數。

+0

好的,謝謝。我的編譯器是g ++所以它應該,對吧? – returneax 2010-12-12 21:23:11

+0

是的。有關可移植性,請參閱http://stackoverflow.com/questions/724465/how-to-check-for-tr1-while-compiling – alexk7 2010-12-15 17:55:55

2

在C++ 0x最新標準草案n3225中,有一節23.6.1類模板unordered_map。

所以它已經在那裏。

C++ 0x unordered_map is based on boost one。 Boost庫本身也有一個名稱空間tr1 :: unordered_map,它共享它自己的boost :: unordered_map的實現。

如果你想比較(當然你不需要比較boost和boost),我認爲其他幾個編譯器,包括microsoft visual studio 2010和gcc,都有自己的unordered_map實現。你可以通過假設他們在名字空間tr1下來使用它們。

#include <unordered_map> 
... 
std::tr1::unordered_map<...> 

我不知道任何基準,但是我覺得在這個早期的時候,任何基準測試是沒有意義的,因爲編譯器實現者肯定會優化自己的實現時,真正的標準定稿,越來越多的人去使用圖書館。

+0

它在'boost'命名空間中,除非你明確要求'tr1'。 – 2010-12-11 03:00:26

+0

現在我應該使用助推器來獲得最佳性能嗎? – returneax 2010-12-11 09:37:30

+5

你現在不應該根據預期的表現做出任何選擇。你應該使用最方便的一個,然後在你分析你的應用程序後找到優化機會,並發現'unordered_map'實現是一個瓶頸 – SingleNegationElimination 2010-12-11 15:55:33

1

它取決於實施和有問題的數據集。當我玩弄unordered_mapblog post我發現VS10的std::unordered_map多perfromed遜於boost::unordered_map爲我所用輸入(我沒有建立一個全面的基準)。理論上認爲不應該有區別。

2

一個未提及的小問題,std::hash函數只需要能夠計算內建類型和字符串(以及其他幾種類型)的散列。函數可以計算更復雜對象的散列,如pairtuple。同時boost還有一個hash_combine函數來幫助爲用戶定義的類型創建哈希。

這意味着std::unordered_set< pair<int, int> >不會編譯,但boost::unordered_set< pair<int, int> >會。如果需要,您可以使用boost::hashstd::unordered_*

(參考:項目6.18英寸the Library Extension Technical Report Issues List

+0

我發現這實際上是非常重要的信息。你不可避免地發現自己正在處理你需要編寫散列函數的類。所以即使在2014年,由於能夠輕鬆創建哈希函數,我在存儲自己類的hashmaps時仍堅持使用boost :: unordered_set。 – moodboom 2014-01-06 17:05:28