STL 關聯容器 hash set

2021-09-06 19:23:03 字數 997 閱讀 5097

容器hash_set是以hash table為底層機制的,差點兒所有的操作都是轉呼叫hash table提供的介面。因為插入無法儲存同樣的鍵值,所以hash_set的插入操作所有都使用hash table的insert_unique介面,**例如以下:

pairinsert(const value_type& obj)

private:

typedef hashtable,

equalkey, alloc> ht;

ht rep; // 底層機制——hash table

public:

hash_set() : rep(100, hasher(), key_equal()) {} // 預設大小為100

這裡把hash table的**大小,也就是vector大小設定為了100,那麼在初始化hash table時,會自己主動選擇最接近的質數為197。也就是說一開始hash_set便擁有了197個「桶」。

以下來比較一下set和hash_set的異同:

set的底層機制為紅黑樹,hash_set的底層機制為hash table,兩者都能進行高效率的搜尋。紅黑樹利用了二叉搜尋樹的特性,而hash table則利用雜湊技術。

但紅黑樹有自己主動排序功能而hash table沒有,反映出來的結果就是,set的元素有自己主動排序功能而hash_set沒有。以下是測試**:

#include #include using namespace std;

using namespace __gnu_cxx;

int main()

執行結果:

因為有197個桶,所以元素1、194、387被雜湊到1號桶;3、196、389被雜湊到3號桶。但新元素是插入到每乙個桶指向的鍊錶的前端,所以就有了這種輸出順序。

參考:

《stl源**剖析》 p270.

STL 關聯容器

1 關聯容器與順序容器的本質區別 關聯容器通過鍵 key 儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。2 關聯容器的型別 map set multimap multiset 3 pair型別 pair型別的比較 p1 p1 p2 如果兩個pair物件的first和secon...

stl 關聯容器

簡介 對於關聯容器,它的每個元素都有乙個鍵 key 容器中的元素的順序並不能人為隨意決定,而是按照鍵的取值公升序排列的。也就是說,對於乙個關聯容器s,使用迭代器在 s.begin s.end 區間內遍歷,訪問到的序列總是公升序的。分類 按照容器中是否允許出現重複鍵值,關聯容器可分為單重關聯容器和多重...

STL 關聯容器

c primer 第11章 關聯容器和順序容器有根本的不同 關聯容器中的元素是按關鍵字來儲存和訪問的。關聯容器型別 分為有序和無序 有序 map 關聯陣列 儲存鍵值對 set 關鍵字即值,即只儲存關鍵字的容器 multimap 關鍵字可重複出現的map multiset 關鍵字可重複出現的set 無...