引言
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%都有例子,是很好的參考資料