前言
本專欄主要以STL源碼剖析分析路線來分析SIGSTL3.0源碼.
整個模塊準備對學習STL源碼剖析
之後做一個系統的總結, 這些都是我個人的理解, 如果分析有什麼問題歡迎各位大佬們指出. 也很感謝作者以及網絡中各個大佬的總結, 讓我也能更容易更深刻的理解到STL
強大和方便, 也讓我對template
感受深刻.
以下是我自己對STL版塊進行分析.
總共分爲六個版塊 : 空間配置器, 迭代器, 容器(序列容器, 關聯容器), 算法, 仿函數, 配接器.
STL前期準備
在學習STL源碼之前需要對template
有一個認識或者回憶.
STL分析
空間配置器
c/c++都需要手動的管理內存, 而封裝實現一個能申請空間又能自己釋放空間不再讓我們自己管理. 而STL就實現了這樣的一個功能, 它就是空間配置器
. 而空間配置器一般是隱藏在各個版塊的組件, 實現中我們都看不到它的存在, 但是它確實是非常重要的部分, 因爲它, 所有的版塊操作內存時都直接調用它就行了, 而不需要再實現內存的分配.
迭代器
每個組件都可能會涉及到對元素的簡單操作, 比如 : 訪問, 自增, 自減等. 每個組件都的數據類型可能不同, 所以每個組件可能都要自己設計對自己的操作. 但將每個組件的實現成統一的接口就是迭代器,
它的優點也很明顯:
- 它是能屏蔽掉底層數據類型差異的.
- 迭代器將容器和算法粘合在一起, 使版塊之間更加的緊湊, 同時提高了執行效率, 讓算法更加的得到優化.
這些實現大都通過traits
編程實現的. 它的定義了一個類型名規則, 滿足traits
編程規則就可以自己實現對STL
的擴展, 也體現了STL
的靈活性. 同時straits
編程讓程序根據不同的參數類型選擇執行更加合適參數類型的處理函數, 也就提高了STL
的執行效率. 可見迭代器對STL
的重要性.
容器
容器是封裝了大量常用的數據結構, 因爲容器, 凸顯出STL的方便, 操作簡單. 畢竟它將常用的但是實現比較麻煩的數據結構封裝之後就可以直接的調用, 不再讓用戶重寫一長串的代碼實現.
容器根據排列分爲了序列式和關聯式.
- 序列式包括
vector
,list
,deque
等. 序列容器有頭或尾, 甚至有頭有尾. - 關聯式包括
map
,set
,hashtable
等. 關聯容器沒有所謂的頭尾, 只有最大值, 最小值.
學習容器的時候要注意end
返回的是最後一元素的後一個地址, 這個地址並沒有儲存實際的值.
序列容器
關聯容器
算法
STL的算法有很多, 有簡單也有一些複雜的, 這裏我就以STL3.0
源碼爲例, 挑選出來幾個常用的算法來進行分析.
仿函數
所謂仿函數也就是函數對象, 以前是這樣稱呼它的, 只是一直沿用至今了. 仿函數就是一種具有函數特質的對象. STL因爲仿函數, 大大在增加了靈活性, 而且可以將部分操作由用戶自己來定義然後傳入自定義的函數名就可以被調用. 但是你會發現仿函數實現的功能都是相當簡單的, 而且都要通過配接器再封裝才能夠使用.
STL的仿函數根據參數個數可以分爲 : 一元仿函數和二元仿函數. 根據功能可分爲 : 算術運算, 關係運算和邏輯運算.
配接器
主要用來修改接口. 修改迭代器的接口, 修改容器的接口, 修改仿函數的接口.
總結
STL這本書對我這個菜鳥收穫還是挺有幫助的, 瞭解了template
的強大, STL對程序做到了最大的優化. STL對每個功能都儘可能的單一, 然後可能通過多次的函數調用才調用真正執行的函數.
讓我對c++的模板有了一個更深的認識, 真的很難, 自己還差的太遠, 努力加油!