重讀STL原始碼剖析 hashtable

2022-09-03 01:15:07 字數 1016 閱讀 4082

hashtable的設計是乙個vector陣列,每個陣列內為乙個鍊錶,煉錶鏈著hash到同位置的節點,但鍊錶的實現不是list或slist

hashtable的節點設計:

1.儲存元素值的變數val

2.乙個指向下乙個節點(同乙個bucket內的)的指標next

hashtable的迭代器:

1.內部維護兩個成員:

指向當前節點的cur

指向所屬bucket的指標

2.迭代器屬於forward_iterator,只能++與讀寫,這是由鍊錶的特性決定的。

hashtable的結構:

1.乙個vector陣列buckets,用於存放節點

2.num_elements用於統計所有節點的個數(不是指vector的大小)

插入與**重整:

插入:

當插入時,首先通過乙個resize(num_elements)用於判斷是否需要重建**,如果需要就擴充。然後進行插入

**重整:

判斷**是否需要重整是通過判斷num_elements是否大於buckets.size()

也就是說如果節點個數大於vector的size,則重整**。

重整的**大小為大於當前**大小的乙個質數,關係上來看接近於兩倍。

**大小調整完後,對原buckets裡的每個節點進行重雜湊(因為**大小變了),重新構造。

底層以hashtable為基礎,插入使用insert_unique

底層以hashtable為基礎,插入使用insert_unique

底層以hashtable為基礎,插入使用insert_equal

底層以hashtable為基礎,插入使用insert_equal

重讀STL原始碼剖析 迭代器

首先關於迭代器 迭代器不屬於容器,它與容器屬於不同的類,但通過迭代器 迭代器中有某些成員變數 同時也對 等運算子進行了過載 可以訪問到容器內的元素 比如list的迭代器,它不屬於list,但它裡面存放了乙個指標,這個指標指向list結構裡的成員node,這樣就可以借用迭代器去訪問容器了。迭代器並不屬...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...