2017-07-08 73 views

回答

4

閱讀the docs。模板需要五個參數,但最後三個默認:

template< 
    class Key, 
    class T, 
    class Hash = std::hash<Key>, 
    class KeyEqual = std::equal_to<Key>, 
    class Allocator = std::allocator< std::pair<const Key, T> > 
> class unordered_map; 

它仍然保存鍵和值,但它使用自定義的散列和平等的測試功能。

2

它沒有四個值:它有四個模板參數(實際上,它需要一個分配器)。 hashid是使用的散列函數,eqid是檢查項目相等性的謂詞。

爲了高效地查找項目,它使用密鑰的散列來查找正確的桶。默認爲std::hash<key_type>

由於碰撞可能會有多個具有相同散列的值,因此還需要謂詞來檢查項目是否相等。默認爲std::equal_to<key_type>

0

STL容器類的參數不僅僅是它們存儲的類型。模板實例化中的前兩種類型是鍵值&值類型。其次是'functor'類型,它首先控制密鑰的哈希如何生成,其次是如何比較兩個密鑰的相等性。後者是必要的,因爲散列函數可以並且將具有將幾個鍵映射到相同散列值的衝突。最後一個參數是分配器,用於獲取散列中節點的存儲以及底層查找表。其他參數對事後調整性能特徵非常有用,但是使用它們的默認值是非常有用的。但是,對於99%的時間,您只需要關注(鍵,值)對模板參數。除非你有令人信服的理由去改變它們。

最後,考慮使用std :: set/std :: map來代替無序的變量。這些容器基於紅黑樹,並提供非常好的分攤性能,還有一些額外的好處,你不會使用散列表(排序的鍵和像lower_bound()這樣的操作),所有這些都不必擔心散列表負載因子,迭代器穩定性以及其他一些缺陷。

相關問題