STL共有六大組件
1、容器 2、算法 3、迭代器 4、仿函數 6、適配器
STL容器的實現原理
STL來管理數據十分方便,省去了我們自己構建數據結構的時間.其實,STL的實現也是基於我們常見的數據結構.
序列式容器:
vector-數組,元素不夠時再重新分配內存,拷貝原來數組的元素到新分配的數組中。
list-雙鏈表。
deque-分配中央控制器map(並非map容器),map記錄着一系列的固定長度的數組的地址.記住這個map僅僅保存的是數組的地址,真正的數據在數組中存放着.deque先從map中央的位置(因為雙向隊列,前后都可以插入元素)找到一個數組地址,向該數組中放入數據,數組不夠時繼續在map中找空閑的數組來存數據。當map也不夠時重新分配內存當作新的map,把原來map中的內容copy的新map中。所以使用deque的復雜度要大於vector,盡量使用vector。
stack-基於deque。
queue-基於deque。
heap-完全二叉樹,使用最大堆排序,以數組(vector)的形式存放。
priority_queue-基於heap。
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。
綜上所述大家應該知道了什么情況下該使用哪一個STL容器更合適,可以在適當時候避免使用一些影響效率的STL容器.