本文首發於: 【決戰西二旗】|理解標準模板庫STL(一)
微信公衆號:後端技術指南針
持續輸出 歡迎關注 會有驚喜哦!
做爲C++程序員最熟悉的莫過於重複造輪子,這裏並非說你能夠造輪子,而是大部分時候咱們被困於造輪子。造輪子的要求很高,要作到複用性、穩定性、效率等諸多考量,簡單寫個api最多算玩具稱不上輪子,對此你可能不想認可。html
C++做爲優秀的服務端語言基本上大公司都有使用,然而C++並不像Python同樣有豐富的統一的基礎類庫和應用類庫,這樣對於程序猿來講很痛苦。今天在A公司上班寫業務代碼、一年後換到B公司寫業務代碼,可是可能徹底是另一種類庫和風格,甚至編譯都有很是多的模式,經驗遷移和學習適應都有必定的成本。linux
C++軟件工程界也一直但願創建一種可重複利用的東西,從類庫、各類組件、設計模式等,均可以無懼時間遷移和人員流失,根本上提高代碼的複用性和程序猿的知識經驗遷移。c++
雖然理想很美好,可是至今C++開發者都沒有得到這種體驗,由於若是一門語言沒有從最開始就推出一套統一且完備的數據結構算法庫、經常使用庫(網絡、加解密、編碼轉換、日誌)等,使用者就只能本身造輪子。程序員
最終即便哪天C++真的大一統了,那麼也只能是那些沒有歷史包袱的新公司或者老公司新業務來嘗試,由於重構絕非易事,尚能不錯的運行,爲啥非要改動?這種想法很是現實而合理。算法
在C++中模板化是代碼複用的重要手段,全世界最聰明的一幫人基於模板化實現了一套完備且工業級的基礎數據結構和算法庫,這就是咱們今天要說的主角:C++標準模板庫STL
。編程
STL是Standard Template Library的簡稱,STL背後的技術支撐是模板,並不要把std::string這些算做STL中,也不要把STL簡單地當作容器的集合。後端
STL是基於模板化實現的容器、算法、迭代器等,能夠簡單認爲STL是裝載對象的對象,而且提供了操做這些對象的方法,因爲使用了模板化,所以對象的類型能夠很豐富,從而實現了一個容納和操做"萬能的"對象。設計模式
STL是世界上衆多聰明人多年的傑做,STL的版本不少常見的有HP STL、PJ STL、 SGI STL等,可是談的最多的是SGI STL。api
HP STL是全部其它STL實現版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto實驗室工做時和Meng Lee共同完成,這個STL是開源的,後續的不少版本都是基於此優化和開發的,不過如今已經不多直接使用這個版本的STL了。數組
微軟VC++裏的STL做者是P.J.Plauger,PJ STL是HP STL的一個繼承版本。
STL之父Alexander Stepanov離開HP以後就去了SGI(Silicon Graphics Computer System, Inc),而後和Matt Austern這些STL大牛一塊兒搞了SGI STL。它也是HP STL的一個繼承版本。後SGI STL被GCC所採用,SGI版本的STL在linux平臺上的性能至關出色。此外,其源代碼的可讀性也很好,所以咱們後面說的STL版本主要是SGI STL。
GNU STL是在SGI STL基礎上gcc編譯器自帶的STL版本,在SGI的基礎上作了一些擴展,包含在libstdc++這個庫裏面。
可見HP STL是其餘STL版本的基礎,其中HP STL和SGI STL算是根紅苗正,都是Alexander Stepanov與其餘大牛一塊兒開發完成的,而且SGI STL是HP STL的新版本,因此國內講解STL的優秀書籍《STL源碼剖析》也是基於SGI STL來說解的。
Alexander Stepanov 1950年11月16日出生在前蘇聯的莫斯科,曾求學於莫斯科國立大學學習數學,他與C++之父是很要好的朋友。Nginx的做者也是俄羅斯人,戰鬥民族在基礎教育和計算機科學教育方面作到還很到位,出了很是多頂級的編程人員,畢竟那裏19歲還不會開坦克都會被嘲笑。想到這裏,看看本身還不能熟練地手撕紅黑樹也真是慌得一批。
在2000年初的時候 Alexander Stepanov有一次著名的訪談,筆者找到了2005年2月的《軟件世界》期刊關於對話STL之父Alexander Stepanov的報道:
那個年代信息流尚未、自媒體更沒有,也沒有動不動就沸騰、一言不合就全世界安靜。感興趣能夠搜索關鍵詞"Interview of Alex Stepanov"查閱相關資料。
STL提供了六大組件,彼此之間能夠用組合套用,六大組件分別是容器、算法、迭代器、適配器、空間配置器。
容器:各類數據結構,如vector、list、deque、set、map等,用來存放數據,從實現角度來看,STL容器是一種class template。
算法:各類經常使用的算法,如sort、find、copy、for_each,從實現的角度來看,STL算法是一種function template。
迭代器:扮演了容器與算法之間的膠合劑,共有五種類型,從實現角度來看,迭代器是一種operator*, operator->, operator++, operator–等指針相關操做予以重載的class template,全部STL容器都附帶有本身專屬的迭代器,只有容器的設計者才知道如何遍歷本身的元素。
仿函數:行爲相似函數,能夠爲算法的某種策略。從實現角度來看,仿函數是一種重載了operator()的class或者class template。
適配器:一種用來修飾容器或者仿函數或迭代器接口的東西。
空間配置器:負責空間的配置與管理,從實現角度看,配置器是一個實現了動態空間配置、空間管理、空間釋放的class template。
交互關係:容器經過空間配置器取得數據存儲空間,算法經過迭代器存儲容器中的內容,仿函數能夠協助算法完成不一樣的策略的變化,適配器能夠修飾仿函數。
在C++標準中,STL被組織爲下面的十幾個頭文件:
<algorithm>
<deque>
<functional>
<iterator>
<array>
<vector>
<list>
<forward_list>
<map>
<unordered_map>
<memory>
<numeric>
<queue>
<set>
<unordered_set>
<stack>
<utility>複製代碼
侯捷《STL源碼剖析》的視頻圖:
STL各個組件的詳細組成部分:
C++ STL 提供幾大類標準容器類的實現:
時間緣由 先寫這麼多 先去上班了 明天繼續。