STL原始碼解析 05關聯容器 02hash

2022-08-21 17:06:13 字數 1363 閱讀 8936

**************************************

hashtable將元素通過hash函式,轉化為一定空間內的關鍵字,方便查詢。

在對映過程中,不同的值可能會影射到相同的關鍵字,這時需要解決該碰撞問題,方法有:

線性檢測,檢測到衝突,循序往下一一查詢,這樣的話,有可能每個元素都需要一一查詢空閒空間,導致平均插入成本很高,這種現場成為主集團。

二次檢測,h+1^2,h+2^2,按照這樣的順序查詢空閒空間,為了提高效率,後乙個h可由前乙個h加上乙個數,

如果兩個數的雜湊值一樣,二次檢測的結果也一樣,這成為次集團。

開鏈:乙個鍵後面跟著乙個list。stl中的hashtable就是這種方式。**

stl中的hash迭代器,是一種forward迭代器,只能+。有指向當前節點的指標和指向對應的vector的指標。**

hashtable結構:

還有乙個vector,每個元素都指向乙個鍊錶。在stl中定義了28個質數,hashtable根據實際的數值,取接近的質數以分配vector的大小,

當現有的節點數》vector的size時,會重新分配vector。

insert分為insert_unique和insert_equal操作,前者保證插入的數不能有重複,後者可以插入鍵值相同的數。可以先用unique之後再用equal。

insert_unique:先呼叫resize函式,看是否需要增大vector,然後插入,vector的索引通過取餘得到。

resize:如果已有元素的個數大於vector的size,需要根據得到的最新質數,分配新的空間,將在舊空間的元素,重新計算hash,

複製到新的空間,最後舊空間與新空間swap一下即可。

insert_equal:也是先呼叫resize,遍歷找到和他相同的節點,在該節點的前面插入。

clear:刪除每乙個節點,vector的內容為null,個數置零。

*#include

#include

#include

using namespace __gnu_cxx;

using namespace std;

int main()

*hash_set:與set的用法一樣,底層是hashtable實現,預設vector大小是100,唯一不同是不排序。

hash_map:與map的用法一樣,底層是hashtable實現,預設vector大小是100,唯一不同是不排序。

hash_multimap:與multimap的用法一樣,底層是hashtable實現,預設vector大小是100,唯一不同是不排序。

hash_multiset:與multiset的用法一樣,底層是hashtable實現,預設vector大小是100,唯一不同是不排序。

*

STL原始碼剖析 關聯式容器

一 set 所有元素都會根據元素的鍵值自動排序,set元素不像map那樣可以同時擁有key和value,set元素的鍵值就是實值,set不允許有兩個相同元素的鍵值。二 map 所有元素都會根據元素的鍵值自動排序,map不允許有兩個元素有相同的鍵值。以紅黑樹作為底層機制,每乙個節點上的內容是乙個pai...

STL原始碼剖析筆記 5關聯式容器

2 rb tree 3 set 4 map 5 multiset 6 multimap 7 hashtable 8511 hash sethash maphash multisethash multimap t operator const key types k 次集團 兩個元素經雜湊函式計算出來...

STL原始碼解析 sort heap

模板函式sort heap具有如下兩個版本 templatevoid sort heap ranit first,ranit last templatevoid sort heap ranit first,ranit last,pr pred 其功能是完成區間 first,last 內元素的堆排序,...