2011-10-01 87 views
15

我知道hash_set是非標準的,unordered_set是標準的。但是,我想知道,性能方面,兩者有什麼區別?他們爲什麼分開存在?std :: hash_set vs std :: unordered_set,它們是相同的東西嗎?

+0

他們單獨存在,因爲一個被創造了,然後其他被做了標準草案的一部分。它們不是同時創建的。 –

+4

@JonathanGrynspan:你爲什麼不回答這個問題?因爲它,你知道,回答這個問題;) –

+0

他們都使用相同的算法? – unixman83

回答

21

由C++標準規定的​​容器的複雜性要求基本上不會留下太多實施空間,這必須是某種散列表。該標準完全意識到這些數據結構已被大多數供應商部署爲擴展。

編譯器供應商通常會調用那些容器「哈希映射」或「哈希集合」,這就是您可能指的(標準中沒有文字std::hash_set,但我認爲GCC中有一個單獨的命名空間,以及類似的其他編譯器)。

當編寫新標準時,作者想要避免與現有擴展庫混淆,所以他們的名字反映了典型的C++思維方式:說出它是什麼,而不是如何實現。無序的容器是無序的。這意味着與訂購的集裝箱相比,您獲得的更少,但是這種效用的降低使您能夠更高效地訪問。

實現的角度來看,的hash_set,升壓-無序的,TR1-無序和C++ 11-無序將是非常相似的,如果不相同。

+0

我認爲你引用的hash_set的命名空間是__gnu_cxx。 – h9uest

1

他們是幾乎相同的事情。標準(C++ 0x)名稱是unordered_set。 hash_set是來自boost和其他人的更早名稱。

+0

非常多,你的意思是隻有名稱不同? MSVC包括他們兩個,這就是爲什麼我很好奇。 – unixman83

+1

MSVC在早期的實現中有一個hash_set。他們可能會保留一段時間,以便讓使用hash_set的開發人員更輕鬆。 MS將hash_set移出std並放入stdext命名空間。你應該使用unordered_set任何新的代碼。具體的算法由編譯器決定。 –

+0

而且MSVC的hash_set的接口與unordered_set的接口略有不同,而GCC的hash_set接口與unordered_set非常相似,如果我沒有記錯的話。 –

2

例如,Visual Studio 2010同時具有hash_xxxunordered_xxx,如果您查看頭文件,至少它們的實現對於所有這些(相同的base//「policy」 - 類)是相同的。 對於其他編譯器,我不知道,但由於哈希容器通常必須如何實現,我想不會有太多的差異,如果有的話。

3

關於從主題開始的問題「它們是否是同一件事」:基於我將代碼從__gnu_cxx :: hash_set升級到std :: unordered_set的經驗,它們差不多,但並非完全相同。

我碰到的區別是迭代通過__gnu_cxx :: hash_set返回的東西似乎是插入的原始順序,而std :: unordered_set不會。正如名字所暗示的,當遍歷整個std :: unordered_set時,不能依賴迭代器以任何特定順序返回項目。

相關問題