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。