1. 程式人生 > >C++ 標準模板庫介紹(STL)

C++ 標準模板庫介紹(STL)

dha 組件 queue 實驗 sstream 基本 自己 regex 程序

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

C++ 標準模板庫介紹(STL)