1. STL 基本介紹
C++ STL(標准模板庫)是惠普實驗室開發的一系列軟件的統稱,是一套功能強大的 C++ 模板類。STL的目的是為了標准化組件,這樣就不用重新開發,讓后來者可以使用現成的組件,和開源組件有點殊途同歸。 STL的版本很多,常見的有HP STL、PJ STL、 SGI STL等,另外,STL庫屬於C++標准庫的一部分,兩者是包含關系。
由於我平時的編程環境主要在Linux系統下,所以在后面總結中,我會主以GNU ISO C++ Library中的STL源碼(5.2.1版本)為主,同時輔以SGI STL 2.91源代碼來進行分析總結,附帶 SGI 主要是因為 SGI STL 版本比較早,代碼可讀性相對會好一點。
至於源碼碼獲取方法: GNU C++庫是在Linux 系統的/usr/include/目錄下;sgi庫的話,到網上搜一下應該就有,我是從這個鏈接中下載的:
https://sourceforge.net/projects/sgistl/?source=navbar
bash-4.2$ ls /usr/include/c++/4.8.5/
algorithm cerrno complex cstdint debug future list profile stdexcept typeindex
array cfenv complex.h cstdio decimal initializer_list locale queue streambuf typeinfo
atomic cfloat condition_variable cstdlib deque iomanip map random string type_traits
backward chrono csetjmp cstring exception ios memory ratio system_error unordered_map
bits cinttypes csignal ctgmath ext iosfwd mutex regex tgmath.h unordered_set
bitset ciso646 cstdalign ctime fenv.h iostream new scoped_allocator thread utility
cassert climits cstdarg cwchar forward_list istream numeric set tr1 valarray
ccomplex clocale cstdbool cwctype fstream iterator ostream sstream tr2 vector
cctype cmath cstddef cxxabi.h functional limits parallel stack tuple x86_64-redhat-linux
STL庫和C++標准庫關系:
STL庫和C++標准庫關系圖(圖片來自網絡)
2. STL 體系結構
STL六大組件
STL主要包含六大組件,每個組件負責不一樣的功能,也涉及到不一樣的知識點,其中屬容器和算法最為主要,其他組件起到牽線 搭橋的作用,讓算法和容器能夠融合的更好,更方便使用。組件之間的大體關系如下圖(圖片來自網絡):
六大組件的交互關系:container(容器) 通過 allocator(配置器) 取得數據儲存空間,algorithm(算法)通過 iterator(迭代器)存取 container(容器) 內容,functor(仿函數) 可以協助 algorithm(算法) 完成不同的策略變化,adapter(配接器) 可以修飾或套接 functor(仿函數)。
3. 分析實現 STL 所需要的技能
在Effective C++第一節中就有總結,C++是一個多重范式的編程語言,同時支持過程式形式,面向對象形式,函數形式,泛型形式,及元編程形式。那在我們平時開發過程中,接觸的比較多的是過程式和面向對象形式。而STL則是泛型編程(GP)的集大成,那么對於GP,我們必須要有模板編程的基礎,了解類模板,函數模板,成員函數模板,模板特化,模板偏特化等。然后還有就是熟悉操作符重載,因為STL中容器存儲的元素是不確定的(泛型),那對於這些用戶自定義的類型,也需要有類似於基本類型(類似int)的運算操作
總的來講,模板和運算符重載是學習STL必要的的技術基礎。
4. 研究 STL 的收獲
我在學習某一個東西的時候,總會問自己,我為什么要學習這個東西? 那么掌握STL可以給我們帶來什么呢?
1. 首先,對於C++這門語言來講,C++主要可以分為四個部分,C,Object-Oriented C++,Template C++,STL (Effective C++上總結),那么為了對C++有個全面的認識和掌握,我們就要去了解和研究STL,掌握泛型思想。 當然,現在來講,C++ 11/17/20 及 boost 中對原有C++的使用優化,相關先進特性,以及對一些其他高級技術的實現和封裝(多線程和多進程等),也是現代C++的組成部分,同樣需要我們去學習和掌握。
2. 圖靈獎得主Pascal之父——Nicklaus Wirth曾經說過 程序設計 = 算法 + 數據結構,剛好,對於想要學習或者鞏固數據結構和算法能力的人來說,STL就是一個寶庫,里面容器底層就是各種經典的數據結構實現的,主流的基本算法也包含在里面 。
因此,對於STL進行分析總結,並加以實現,可以提升我們的語言掌握度及相關編程思維,還有就是數據抽象能力!
2018-08-29 23:27:46