(一)STL體系結構基礎介紹
一、STL六大部件
容器(Containers):存放元素,記憶體由分配器搞定
分配器(Allocator):支援容器的記憶體分配
演算法:操作容器元素的函式。與OO不同(面向物件將元素與函式放到一個類裡),GP(模板程式設計)將資料放入容器,操作方法放入演算法中。
迭代器(Iterator): 演算法和容器之間的橋樑,通過迭代器,演算法才能去操作容器中的元素。迭代器就是泛化的指標。
介面卡(Adapters):對其他元件進行轉換。
仿函式(Functors):自定義類的相關操作(比如自定義類A,計算其兩個例項的相加、相減等,即操作符過載)。
二、一個例子使用六大部件
通常allocator那部分不用寫。
三、容器遍歷
前閉後開區間
使用auto,for遍歷
auto的其他用法
四、容器結構與分析
1、順序容器
Array:固定大小,連續空間存放
Vector: 當容量不夠時,allocator在背後重新分配
Deque: 雙端佇列
List: 雙向連結串列
ForwardList:單向連結串列
2、關聯容器(包括Unordered_Containers)
關聯容器的查詢很快
Map/Set:一般用紅黑樹實現(左右高度平衡的二叉樹)
MultiMap/MultiSet: key可重複的。
Map是key-value,Set是key-key。
無序容器:元素存放的位置是不固定的,由hash-table實現(目前最好的實現方式是seperate chaining)。
五、容器使用
1、編碼習慣
(1)為每個獨立的程式建立namesapce;
(2) 在用到變數時才定義變數,但不縮排;
2、vector
(1)因為單向,只能通過push_back存放元素(從頭存放需要移動整個vector);
(2) 當空間不足,重新分配記憶體時,記憶體兩倍增長;
(3)可以通過front,back訪問首尾元素,data訪問首地址(vector, array, list);
3、List
標準庫有sort,各個容器也有自帶sort,排序儘量用自帶的sort。每次擴充一個結點,空間利用率高
4、forwad_list
(1)壓入元素用的是push_front(其他用的都是push_back);
(2)只有front訪問首元素(back,size都不提供);查詢較慢。
5、deque
(1)記憶體分段連續(由buffer構成,每個buffer是連續的),當記憶體不夠時,重新分配一個buffer。
(2)沒有自帶的sort,只能使用全域性的sort
6、stack、queue
內部都是通過deque來實現,一個後進先出,一個先進先出(不提供iterator)。有人也稱之為容器的介面卡(Adapter)
7、multiset/multimap
(1)通過insert插入元素(會慢一點),有自帶的find進行查詢(很快)
(2)multimap: c.insert(pair<int, string>(i, buf)),不能使用c[i]來進行插入(key可能重複)
(3)查詢時(*item).first為key,second為value
8、unordered_multiset/unordered_multimap
雜湊表實現
9、map
可通過m[i]=c來插入,內部會形成pair<>(i, c)來進行插入