引言
C++ STL可以分為標準容器,演算法和函數對象,迭代器和分配器,利用C++標準程式庫,可以大量減少我們的代碼,提高代碼的穩定性和健壯性。
標準容器
C++標準容器分為序列容器和關聯容器,對於序列容器,C++提供的基本序列有
vector 支援隨機訪問,不適合做插入和刪除操作頻繁的情境
list 雙向鏈表,適合做元素的插入和刪除,不是隨機訪問
deque 也是一個雙端序列,但是經過最佳化,其雙端操作效率類似list,隨即訪問效率接近vector。
從它們出發,通過定義適當的借口,產生了
stack 預設用deque實現
queue 預設是deque實現
priority_queue 預設是vector儲存元素,實現最可能是heap
對於關聯容器,C++提供的有:
map 映射
mulitimap 多重新對應,相比map,允許重複的key
set 被看做是一個map,其中的值是無關緊要的
mulitiset 相比set,允許重複的key
bitset 位集合
hash_map 散列映射,通過實現一個散列函數,將容器實現為一個散列表,以減少尋找元素所需要的時間
標準容器具體用法可以參考C++線上手冊STL容器:http://www.cplusplus.com/reference/stl/
演算法和函數對象
容器本身之所以有用,是因為容器提供了一些基本操作,如確定大小,迭代,複製,排序,尋找等。標準庫提供了許多演算法,服務於容器使用者的最普遍和最基本的需要。
標準庫演算法不過就是60個,每個演算法都描述為一個模板函數或一組模板函數,例如最常用的排序演算法:sort,能以很好的平均效率排序,建議排序都用sort替換C語言的qsort,sort可以更好結合容器。
標準庫演算法和函數對象的教程可以參考C++之父的C++程式設計語言的演算法和函數對象,這一章內容可以教你如何使用標準庫演算法和函數對象。
標準庫演算法的聲明在<algorithm>,函數對象在<functional>裡。
標準庫演算法具體用法參考C++線上手冊STL演算法:http://www.cplusplus.com/reference/algorithm/
迭代器和分配器
迭代器是串連容器和演算法的紐帶,讓寫演算法的人不必關心各種資料結構的具體細節,而分配器提供了一個映射,將低級的位元組形式的資料模型映射到進階的物件模型。
迭代器是每個程式員都需要關心的概念之一,但是分配器僅僅是一個支援機制,標準庫已經提供了預設的分配器,很少有程式員需要去寫新的分配器。
迭代器在接觸STL容器就會瞭解了,一般迭代器分為正向迭代器,反向迭代器,插入迭代器,帶檢查的迭代器。
至於分配器提供了一套分配和釋放儲存的標準方式,標準庫提供了一個標準分配器,在<memory>裡的標準allocator模板用operator new()分配儲存,所有的標準容器在預設情況下使用它,當然你也可以自己實現一個分配器,容器的實現需要一次次的allocate()或者deallocate()對象,意味著new的大量調用,你可以採用一個固定大小儲存塊的儲存池,可以比常規的更通用的operator new()的效率高一些。
總結
學習C++標準程式庫,可以先學會應用標準容器的簡單用法,如vector,map,慢慢熟悉之後,再接觸演算法,也是學習演算法的幾個函數的簡單用法,例如sort,swap等。
學會應用可以學習理論:考慮看下C++之父的C++程式設計語言的標準庫,也可以看更厚的書:C++標準程式庫。
最後,你在工作和編程中,都需要C++容器和演算法的手冊查閱,這些可以參考上面的網址:
C++線上手冊STL容器:http://www.cplusplus.com/reference/stl/
C++線上手冊STL演算法:http://www.cplusplus.com/reference/algorithm/
這裡面詳細介紹了每個容器和演算法的每個函數,幾乎95%都有例子,是很好的參考資料