STL中各個容器的實現基本原理以及互相依賴

STL中一共擁有六大組件:

1.算法 2.迭代器 3.容器. 4.仿函數 5.適配器(配接器)6.空間配置器


通過閱讀侯捷版本的《STL源碼剖析》可以知道,STL的實現也是由基本的數據結構來完成的


容器大概可以分爲關聯型容器和序列型容器,

序列型容器有vector,list,deque,queue,stack,slist,heap,priority_queue

vector由數組實現,當現有數組容量不足時,申請新的內存,每次新增一倍當前容量的內存。

deque翻譯爲雙端隊列,但它由一箇中央控制器(map——此map非彼map)負責實現,deque的數據保存在零零散散的多個固定長度的數組中,而map中保存着一個指針,指針分別指向這些數組,deque先從map的中間位置(因爲是雙端隊列,故各個指針是由中間向兩端依次排開)獲取指針,然後移動到具體的數組中存放數據。當數組不夠用時,申請新的數組並在map中記載指針,當map也不夠時,申請新的map,並且將原有的Map拷貝至新申請的map中來。因此map的複雜度大於vector。


stack、queue基於deque;

heap:完全二叉樹,使用大頂堆實現,然後進行排序,以vector的形式存放

priority_queue:基於heap

list:雙向環形鏈表

slist::單鏈表

關聯式容器:
set,map,multiset,multimap-基於紅黑樹(RB-tree),一種加上了額外平衡條件的二叉搜索樹。
hash table-散列表。將待存數據的key經過映射函數變成一個數組(一般是vector)的索引,例如:數據的key%數組的大小=數組的索引(一般文本通過算法也可以轉換爲數字),然後將數據當作此索引的數組元素。有些數據的key經過算法的轉換可能是同一個數組的索引值(碰撞問題,可以用線性探測,二次探測來解決),STL是用開鏈的方法來解決的,每一個數組的元素維護一個list,他把相同索引值的數據存入一個list,這樣當list比較短時執行刪除,插入,搜索等算法比較快。
hash_map,hash_set,hash_multiset,hash_multimap-基於hash table。


發佈了38 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章