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容器的具...