我碰到下面的代碼來:unordered_map<id, id, hashid, eqid> map
這個C++ unordered_map如何有四個值?我認爲這是一個鍵值對
所有無序地圖我只看過有兩個「PARAMS」,關鍵和值類型,什麼其他兩個呢?
我碰到下面的代碼來:unordered_map<id, id, hashid, eqid> map
這個C++ unordered_map如何有四個值?我認爲這是一個鍵值對
所有無序地圖我只看過有兩個「PARAMS」,關鍵和值類型,什麼其他兩個呢?
閱讀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;
它仍然保存鍵和值,但它使用自定義的散列和平等的測試功能。
它沒有四個值:它有四個模板參數(實際上,它需要一個分配器)。 hashid是使用的散列函數,eqid是檢查項目相等性的謂詞。
爲了高效地查找項目,它使用密鑰的散列來查找正確的桶。默認爲std::hash<key_type>
。
由於碰撞可能會有多個具有相同散列的值,因此還需要謂詞來檢查項目是否相等。默認爲std::equal_to<key_type>
。
STL容器類的參數不僅僅是它們存儲的類型。模板實例化中的前兩種類型是鍵值&值類型。其次是'functor'類型,它首先控制密鑰的哈希如何生成,其次是如何比較兩個密鑰的相等性。後者是必要的,因爲散列函數可以並且將具有將幾個鍵映射到相同散列值的衝突。最後一個參數是分配器,用於獲取散列中節點的存儲以及底層查找表。其他參數對事後調整性能特徵非常有用,但是使用它們的默認值是非常有用的。但是,對於99%的時間,您只需要關注(鍵,值)對模板參數。除非你有令人信服的理由去改變它們。
最後,考慮使用std :: set/std :: map來代替無序的變量。這些容器基於紅黑樹,並提供非常好的分攤性能,還有一些額外的好處,你不會使用散列表(排序的鍵和像lower_bound()這樣的操作),所有這些都不必擔心散列表負載因子,迭代器穩定性以及其他一些缺陷。