什么是STL
我想告訴我什么是STL,也想告訴你什么是STL。
- 什么是大名鼎鼎的STL
- L
- T
- S
- 小結
- STL作者
- STL組成
- 組成圖示
- STL如何工作
- 為什么使用STL
- 高可重用性
- 高性能
- 高移植性
- 跨平臺
- STL分類標準
什么是大名鼎鼎的STL
開始說明STL之前先來告訴大家一句話,如果你通過我的博客看懂了STL,或者有所收獲必定會對于這句話有著更加深刻的哲學理解。
這句話就是:如果說我看得遠,那是因為我站在巨人的肩膀上。
因為在使用C++開發業務邏輯代碼的過程中,必然會使用到STL,所以STL對于C++程序員工作來說非常重要。當然如果你要面試C++相關的崗位,我也希望能幫你更加深刻的理解STL,讓你在面試中如果面試官問到STL的內容時,你能夠有自己的理解和思路。
L
好了進入正題,接下來我們說明大名鼎鼎的STL。
首先,什么是STL呢?
STL = Standard Template Library。
Library 表示STL是一個函數庫。
函數庫的目的又是什么呢?函數庫又是干什么用的呢?
函數庫存在的目的就是避免重復造輪子。
我們學習過C語言和C++語言必定知道一套函數庫用來解決一類問題,函數庫里面整合了解決該類問題的大量函數。我們舉例子進行說明:
就像大家以前用的函數sin/random等來自數學庫。
printf/fopen/fread/fwrite等來自 io 庫。
strcpy/strcmp/strcat 等來自字符串庫。
每一種函數庫都解決了一類問題。比如數學庫,解決通用數據運算問題,io 庫解決了輸入輸出問題, 字符串庫解決了字符串的生成,復制,拼接等問題。
所以說函數庫的存在就是避免重復造輪子,提高了開發效率。
STL 作為一個庫,解決了哪些問題呢?
STL解決的就是很多讀者都很頭疼的問題:數據結構與算法。
從此,數據結構和算法,不再是王謝堂前燕,經過 STL 后,己飛入尋常百姓家了。
T
那么接下來的 T 也就是 Template
Template 中文是模板的意思,模板解決了什么問題呢?
核心的一句話就是:模板解決了泛型編程的問題。
模板抹平了數據類型的差異,我們說STL中的算法,算法是解決問題的步驟,那么就不關心操作的是什么類型的數據,而是關系如何操作數據。
例如:排序算法,我們并不關心對于什么數據進行排序,更加關心的是排序的思想,如何來搬運數據。
C++引入Template 后,泛型編程才算是落到了實處,其實也是解決避免重復造輪子,提高開發效率的問題。
S
那么最后就是Standard 標準。
為什么說是標準呢?
STL 己經被C++委員會納入 C++標準的一部分。以前說 C++有三大特征,**封裝,繼承,多態。**現在至少要說,C++四大特征,封裝,繼承,多態和 模板STL。
但凡支持C++的平臺都支持STL。
小結
STL 是由 C++模板編寫的一套己納入 C++標準的類庫,該庫解決了通用數據結構與算法的問題。
STL作者
STL 它是由 Alexander Stepanov、Meng Lee 和 David R Musser 在惠普實驗室工作時所開發出來的。亞歷山大·斯特潘諾夫(AlexanderStepanov),STL(標準模板庫)之父,并因此而榮獲第一屆 Dr. Dobb’s 程序設計杰出獎, 現在是 Adobe 公司首席科學家。他曾是康柏電腦公司的副總裁和首席科學家,AT&T 實驗室副總裁和首席架構師,SGI 服務和超級計算機業務首席技術官。
上面的作者就是簡單介紹一下,讀者可以了解一下,既然要學習STL,就要了解STL的發明者。
接下來送給所有讀者STL作者說過的一句話:
程序基于精確的數學——STL 之父 Alex Stepanov。
STL組成
組成圖示
STL 主要由空間配置器 allocator,容器 container,算法 algorithm,迭代器iterator 和仿函數 functor組成。
適配器是容器的適配器、仿函數的適配器和迭代器的適配器。
STL里面核心的是容器和算法。
STL的設計違背OO的思想:
容器用來存放數據,算法用來操作數據,也就是行為。
OO的思想是面向對象:數據和行為統一。
但是上面的圖示中數據和方法是分開的,所以我們說設計上有違背OO的思想。從宏觀上來說,STL是一個整體,那就是OO的思想,但是如果從內部來看就有點違背OO的思想。
通過迭代器連接算法和容器。
仿函數起到了算法決策的作用,也就是對于容器中的數據進行操作的條件。
STL如何工作
接下來我們看STL的幾大部件如何來進行工作?
代碼演示:
運行結果:
圖解分析(代碼):
圖解分析(容器):
上面通過不同的顏色框圖對于STL的結構對應的代碼進行對應。
容器用來存放數據,allacotor < int >用來在底層開辟內存空間。
算法通過迭代器完成對于容器數據的計算操作。
仿函數起到一個決策的作用>5? >3? >2?。
仿函數起到對于容器中的數據進行操作的條件作用。
關于bind和function我們只是在這里簡單提出,如果刨析會比較麻煩,但是最核心的心法給大家說明,想要詳細了解的讀者可以自行搜索或者看我對應博客,因為在這里不影響STL的說明,所以不多贅述。
bind:實現了可調用對象 + 參數,綁定為一個新的可調用對象。
bind 解決了 對象 + 參數的問題。
funcation:起到了統一接口的功能,具有取代多態的趨勢。
為什么使用STL
高可重用性
STL 中幾乎所有的代碼都采用了模板類和模板函數的方式實現,這相比于傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
高性能
如 map 可以高效地從十萬條記錄里面查找出指定的記錄,因為 map 是采用紅黑樹的變體實現的。 (紅黑樹是平衡二叉樹的一種)
STL里面很多都是數學家寫的,所以性能上不存在問題。
高移植性
如在項目 A 上用 STL 編寫的模塊,可以直接移植到項目 B 上。
跨平臺
如用 windows 的 Visual Studio 編寫的代碼可以在 Mac OS 的 XCode 上直接編譯。
STL分類標準
總結
- 上一篇: 《C++PrimerPlus》阅读笔记
- 下一篇: 实现公司管理系统【C++实战】(53)