C++STL源碼剖析篇-六大組件功能

從本期文章開始,我將帶領大家一起學習STL,本人對《STL源碼剖析》這本書進行全面解讀,呈現給各位讀者們。咱們開始吧

我們大家都知道STL六大組件。

STL 提供六大組件,彼此可以組合套用:

  • 1. 容器( containers):各種數據結構,如 vector, list, deque, set, map,用來存放數據。從實作的角度看, STL 容器是一種 class template。就體積而言,這一部份很像冰山在海面下 的比率。
  • 2. 算法( algorithms):各種常用算法如 sort, search, copy, erase…,從實作的角度看, STL 算法是一 種 function template。
  • 3. 迭代器( iterators):扮演容器與算法之間的膠著劑,是所謂的「泛型指標」,共有五種類型,以及其它衍生變化。從實作的角度看,迭代器是一種將 operator*, operator->, operator++, operator-- 等指標相關操作予以多載化的 class template。所有 STL 容器都附帶有自己專屬的迭代器 — 是的,只有容器設計者才知道如何巡訪自己的元素。原生指標( native pointer)也是一種迭代器。
  • 4. 仿函式( functors):行為類似函式,可做為算法的某種策略( policy),從實作的角度看,仿函式是一種重載了 operator()的 class 或class template。 一 般函式指標可視為狹義的仿函式。
  • 5. 配接器( adapters): 一種用來修飾容器( containers)或仿函式( functors)或迭代器( iterators)接口的東西。例如 STL 提供的 queue 和 stack,雖然看似容器,其實只能算是一種容器配接器,因為它們的底部完全借重 deque,所有動作都由底層的 deque 供應。改變 functor 接口者,稱為 function adapter,改變 container 接口者,稱為 container adapter,改變iterator 界面者,稱為 iterator adapter。配接器的實作技術很難一言以蔽之。
  • 6. 配置器( allocators):負責空間配置與管理。從實作的角度看,配置器是一個實現了動態空間配置、空間管理、空間釋放的 class template

下圖展示了六大組件的關係:

C++STL源碼剖析篇-六大組件功能

STL 六大組件的交互關係: Container 透過 Allocator 取得數據儲存空間, Algorithm 透過 Iterator 存取 Container 內容, Functor 可以協助 Algorithm 完成不同的策略變化, Adapter 可以修飾或套接 Functor。這句話看三遍!!!

由於 STL 已成為 C++ 標準鏈接庫的大脈系,因此目前所有的 C++ 編譯器一定支援有一份 STL。在哪裡?就在相應的各個 C++ headers。是的, STL 並非以二進位碼( binary code)面貌出現,而是以原始碼面貌供應。也就是說作為讀者的我們可以通過源碼的方式查看STL實現方式。按 C++ Standard 的規定,所有標準表頭檔都不再有擴展名,但或許是為了回溯相容,或許是為了內部組織規劃,某些 STL 版本同時存在具擴展名和無擴展名的兩份檔案,例如 VisualC++ 的 Dinkumware 版本同時具備 ;某些 STL 版本只 存 在 有擴展名的headers , 例 如 C++Builder 的 RaugeWave 版 本 只 有。某些 STL 版本不僅有一線裝配,還有二線裝配,例如 GNU C++ 的SGI 版本不但有一線的,還有二線的

總結:

如果只是應用 STL,請各位讀者務必從此養成良好習慣,遵照 C++ 規範,使用無擴展名的headers。在接下去的文章中,探究 STL 源碼,就得清楚所有這些headers的組織分佈。

下面是本人整理的鏈接,能夠幫助大家快速尋找文章。

【C++進階篇系列】

【Linux系統篇系列】

【C++知識點系列】

【高級網絡編程系列】

喜歡我的文章的話,就關注我吧!不要只收藏和轉發哦,每天至少兩篇編程知識給大家,都是本人多年的經驗總結!


分享到:


相關文章: