我知道hash_set
是非標準的,unordered_set
是標準的。但是,我想知道,性能方面,兩者有什麼區別?他們爲什麼分開存在?std :: hash_set vs std :: unordered_set,它們是相同的東西嗎?
回答
由C++標準規定的容器的複雜性要求基本上不會留下太多實施空間,這必須是某種散列表。該標準完全意識到這些數據結構已被大多數供應商部署爲擴展。
編譯器供應商通常會調用那些容器「哈希映射」或「哈希集合」,這就是您可能指的(標準中沒有文字std::hash_set
,但我認爲GCC中有一個單獨的命名空間,以及類似的其他編譯器)。
當編寫新標準時,作者想要避免與現有擴展庫混淆,所以他們的名字反映了典型的C++思維方式:說出它是什麼,而不是如何實現。無序的容器是無序的。這意味着與訂購的集裝箱相比,您獲得的更少,但是這種效用的降低使您能夠更高效地訪問。
實現的角度來看,的hash_set,升壓-無序的,TR1-無序和C++ 11-無序將是非常相似的,如果不相同。
我認爲你引用的hash_set的命名空間是__gnu_cxx。 – h9uest
他們是幾乎相同的事情。標準(C++ 0x)名稱是unordered_set。 hash_set是來自boost和其他人的更早名稱。
非常多,你的意思是隻有名稱不同? MSVC包括他們兩個,這就是爲什麼我很好奇。 – unixman83
MSVC在早期的實現中有一個hash_set。他們可能會保留一段時間,以便讓使用hash_set的開發人員更輕鬆。 MS將hash_set移出std並放入stdext命名空間。你應該使用unordered_set任何新的代碼。具體的算法由編譯器決定。 –
而且MSVC的hash_set的接口與unordered_set的接口略有不同,而GCC的hash_set接口與unordered_set非常相似,如果我沒有記錯的話。 –
例如,Visual Studio 2010同時具有hash_xxx
和unordered_xxx
,如果您查看頭文件,至少它們的實現對於所有這些(相同的base//「policy」 - 類)是相同的。 對於其他編譯器,我不知道,但由於哈希容器通常必須如何實現,我想不會有太多的差異,如果有的話。
關於從主題開始的問題「它們是否是同一件事」:基於我將代碼從__gnu_cxx :: hash_set升級到std :: unordered_set的經驗,它們差不多,但並非完全相同。
我碰到的區別是迭代通過__gnu_cxx :: hash_set返回的東西似乎是插入的原始順序,而std :: unordered_set不會。正如名字所暗示的,當遍歷整個std :: unordered_set時,不能依賴迭代器以任何特定順序返回項目。
- 1. std :: vector比std :: unordered_set更快嗎?
- 2. unordered_set from std
- 3. std :: unordered_set構造函數
- 4. 在std :: vector上使用std :: unique()<std :: unordered_set <T>>
- 5. 有沒有像std :: value_wrapper與std :: reference_wrapper並行的東西?
- 6. std :: unordered_set insert獲取對象
- 7. 何時使用std :: unordered_set而不是std :: set?
- 8. std :: mem_fun vs std :: mem_fn
- 9. 區別:std :: runtime_error vs std :: exception()
- 10. std :: list vs std :: vector迭代
- 11. std :: std :: string保證.c_str()返回相同的結果嗎?
- 12. em和百分比是相同的東西,它們是相應的默認值嗎?
- 13. 在std :: set中的順序和std :: unordered_set的區別
- 14. 爲什麼std :: unordered_set的std :: hash函數不區分大小寫?
- 15. 高效地將std :: unordered_set的內容移動到std :: vector
- 16. 的std :: unordered_set與自定義分配器
- 17. 在C++ 11之前是否有類似於std :: function的東西?
- 18. 的std ::刪除VS的std ::的remove_if
- 19. 的std ::領帶VS的std :: make_tuple
- 20. std:排序vs插入std :: set
- 21. L2E這兩個是相同的東西?
- 22. 測試應該是相同的東西
- 23. Keras總是輸出相同的東西
- 24. 相當於std :: set嗎?
- 25. 何時使用std :: async vs std :: threads?
- 26. std :: unordered_set允許插入重複記錄
- 27. C++ 11 unordered_set與std :: owner_less-like哈希
- 28. snprintf vs std :: stringstream
- 29. 我們真的需要std :: error_category和std :: error_condition嗎?
- 30. PHP中的類和對象是相同的東西嗎?
他們單獨存在,因爲一個被創造了,然後其他被做了標準草案的一部分。它們不是同時創建的。 –
@JonathanGrynspan:你爲什麼不回答這個問題?因爲它,你知道,回答這個問題;) –
他們都使用相同的算法? – unixman83