STL源碼剖析-chapter1

侯捷的源碼剖析第一章已經看完,並做了筆記與總結。如下。
注:
1、本人目前仍在在找工作,沒有經驗,有出錯請聯繫我改正
2、測試環境:g++ -v4.8.4 VS2013
3、CSDN使用不熟練,上傳了一份筆記文檔,也附上筆記源碼(以備文檔無法下載)
3、測試代碼暫未上傳,等學會這一功能(上傳.zip文件)一定上傳
4、需要代碼的請先聯繫下方

注:
1、本章的知識點已經總結,放在了本文檔的最後一部分,沒有時間學習、想要直接記結論的朋友直接跳到最後即可
2、完成時間 2018-11-16 11:47(這個階段本人也是菜鳥在找工作,剛畢業,沒有任何項目經驗)
3、有出錯的地方請告知我,方便我學習改進
4、聯繫方式
QQ 943588990
引介
1、
在這裏插入圖片描述
2、會用、明理、能擴展

前言
1、開放性封閉原則
(1)對擴展開放,意味着有新的需求或變化時,可以對現有代碼進行擴展,以適應新的情況。
(2)對修改封閉,意味着類一旦設計完成,就可以獨立完成其工作,而不要對類進行任何修改。
2、出處
(1)空間適配器allocator 第2章
(2)<stl_construct.h> 對象構造與析構的基本函數
(3)<stl_uninitialized.h> 內存管理的基本函數
(4)<stl_algobase.h> 各種基本算法
3、http://www.stlport.org SGI ST爲藍本的高度可移植性實現版本

第一章STL概論與版本簡介
一、STL概論
二、STL6大組件
(一)容器containers
(二)算法algorithms
(三)迭代器iterators 所謂的”泛型指針” 共5種類型
1、所有的STL容器都附帶自己專屬的迭代器
2、原生指針(native pointer)也是一種迭代器
3、迭代器重載了p* p-> p++ p–操作
(四)仿函數functions
1、仿函數是一種重載了 operator()的class或class template
(五)適配器adapters
1、queue、stack只能算是容器配接器,底層藉助deque
(六)配置器allocators 負責空間配置與管理
1、從實現角度來看,配置器是一個實現了動態空間配置、空間管理、空間釋放的class template

(七)關係圖
在這裏插入圖片描述
(八)
三、GNU源代碼開放精神 open source
四、HP實現版本 所有STL版本的始祖
五、PIPlauger版本
繼承自HP版本,但不屬於 open source範疇
六、Rouge Wave版本
繼承自HP版本,但不屬於 open source範疇
七、STLport實現版本
八、SGI STL版本 繼承自HP版本 oprn source
(一)SGI STL文件分佈於簡介

(二)SGI STL的編譯器組態設置 <stl_config.h>
此處不放置截圖了。
(三)令人困惑的C++語法
測試環境 g++、gcc 4.8.4(課本上使用的是GCC for windows)
在這裏插入圖片描述
VS2013 win8.1
1、重點測試組態:classes、functions
2、組態測試:(GCC常量測試)
(1)測試 __STL_STATIC_TEMPLATE_MEMBER_BUG
(1)g++編譯不同過、VS2013運行如下:
雖然是類模板,但是所有實例化後的靜態值均按照第一次賦值的值來算;
Static變量可修改,但是所有類模板的static變量的修改後的值最終按照最後一個賦值的值來算;
(2)測試代碼另附
(2)測試 ___STL_CLASS_PARTIAL_SPECIALIZATION
(1)g++通過、VS13通過
編寫代碼時發現類模板竟然可以“重載”,運行時會發生自動匹配現象
(2)代碼另附
(3)測試 __STL_FUNCTION_TMPL_PARTIAL_ORDER
(1)g++通過、VS13通過
運行結果顯示爲空,在VS13中debug發現main()中的swap實際上是調用的C++系統庫中的swap()模板
在這裏插入圖片描述

(2)代碼另附
(4)測試 __STL_EXPLICIT_FUNCTION_TMPL_ARGS
(5)測試 __SEL_MEMBER_TEMPLAYES
(1)g++編譯報錯如下(內部模板類聲明出錯),VS13運行通過
在這裏插入圖片描述

(2)代碼
在這裏插入圖片描述

(3)
(6)測試 __STL_LIMITED_DEFAULT_TEMPLATES
(1)g++失敗:類模板參數列表定義出錯
在這裏插入圖片描述
(2)VS13運行通過
在這裏插入圖片描述
(3)G++不支持類模板的參數列表template設置默認值,VS則支持
(7)測試 __STL_NON_TYPE_TMPL_PARAM_BUG
(1)g++通過、VS13通過
(2)本程序我沒有明白要測試的目的,但是我從程序代碼及運行結果讀到的信息是:類模板實例化時也支持默認參數
(3)代碼另附
(8)
3、以下組態也在<stl_config.h>定義,使用於整個SGI STL中,有認識的必要
(1)測試 __STL_NULL_TMPL_ARGS(常用於class templates的friend函數聲明)
在這裏插入圖片描述
展開後變成:
在這裏插入圖片描述
Class template的某個具現體與friend functions template的某個具現體有一對一的關係
(1)測試過 __STL_LIMITED_DEFAULT_TEMPLATES的注意到,它的程序代碼與本次測試的代碼有相似之處,如下:
在這裏插入圖片描述
即:STL是否支持類模板的前一個參數作爲下一個參數的默認設置值?
答案是:g++(glibc)不支持,但是VS支持
G++編譯報錯如下:(編譯出錯一般先看第一個錯誤)
在這裏插入圖片描述
本次代碼涉及一個問題:如何聲明友元友元函數?
如何聲明模板類的友元函數?
(2)代碼另附(爲讀者方便,貼圖如下)
在這裏插入圖片描述
(3)
(2)測試 __STL_TEMPLATE_NULL(類模板的明確分工)
定義與使用場合
在這裏插入圖片描述
展開後:
在這裏插入圖片描述
使用說明:
在這裏插入圖片描述
(1)對原代碼做的改動
在這裏插入圖片描述
不做改動時的報錯情況(報錯:宏前面必須要有template<>)
在這裏插入圖片描述

(2)編譯說明
不做改動時GCC、VS均無法編譯
做了改的那個後gCC可以通過,VS不可通過
(3)所謂的明確分工:在聲明類模板時指定具體類型
(4)代碼另附

(3)
4、臨時對象的產生於運用
(1)產生分爲兩種情況:
1)不在程序員預期之內:如按值傳遞
2)刻意製造:類型後加()並可設置初值 如int(8);
(2)運用:
可以製造對象的方法常用於仿函數與算法
(3)測試注意說明
VS可以運行通過,G++編譯時報錯如下(由不支持C++11帶來的構造問題)
在這裏插入圖片描述
解決辦法:編譯時加上 -std=c++11
在這裏插入圖片描述

(4)代碼另附
5、靜態整型常量可以在類內直接初始化
這個其實沒有啥說的,記住就行。
測試時添加代碼:對靜態非const整型常量在類內初始化時g++、VS均失敗
對靜態const浮點型常量在類內初始化時g++可以運行、VS編譯失敗
代碼另附
6、Increment、decrement、dereference(增加、減少、取值)運算符
(1)此程序中涉及到的知識點
1)++、–運算符的重載問題
2)<<運算符重載函數的寫法、位置
3)友元函數的聲明
4)佔位參數(可以一起復習一下默認參數)
(2)在debug此程序的時候,我發現 I++ 其實走的是佔位參數所在的那個函數 --I走的是沒有佔位參數的那個函數

也就是說,前++、後++的調用問題其實與你的佔位參數位置有關。佔位參數位置不同,函數調用結果不同
建議的寫法(也就是說如果你測試類中++、–重載的問題時想得到與你初學++、–時一樣的結果,請看下圖)
在這裏插入圖片描述
(3)針對上述圖片闡述的問題,請讀者自己debug(代碼另附)
(4)<< 、>>運算符重載只能寫在類的外部,因爲如果寫在類內時,調用會出現如下圖所示的現象
在這裏插入圖片描述
在這裏插入圖片描述
(5)
7、Function call操作符operator(())
(1)涉及到的知識點:c語言函數指針、qsort()用法
在這裏插入圖片描述
(2)仿函數functor
如果針對某個class進行operator()重載,它就成爲一個仿函數functor
仿函數的編譯問題
如果類名首字母小寫,編譯時會提示 “類名”不識別
所以類名都要首字母大寫
(3)

                     ***總結:***

STL6大組件:容器、算法、迭代器、仿函數、適配器、配置器
SIG STL opensource
STL編譯器組態測試(gcc、g++常量測試)
測試環境 gcc v4.8.4 win VS2013

組態測試結果:
不同的具現體:
如vector vector是vector的不同具現體
僅VS支持:

  • __STL_STATIC_TEMPLATE_MEMBER_BUG
    1、設類模板中有static變量,則有具現體後,所有具現體的該static變量的值均按照第一次賦值來算
    2、該static變量可以修改,所有具現體的該static變量的修改後的值均按照最後一次賦值來算。
    *__SEL_MEMBER_TEMPLAYES
    1、只有類模板參數列表出現過的類型,纔可以在類內放心使用

*__STL_LIMITED_DEFAULT_TEMPLATES
1、類模板的參數列表可以出現其他的類模板,其他的類模板可以使用已有的T設置默認類型

#__STL_NULL_TMPL_ARGS
1、普通類內友元函數的聲明問題
2、類模板類內友元函數的聲明問題

僅g++支持:

__STL_TEMPLATE_NULL(類模板的明確分工)

1、需要添加空的模板聲明 template<>
2、所謂的明確分工:在聲明類模板時指定具體類型

倆者均支持:
*___STL_CLASS_PARTIAL_SPECIALIZATION
1、類模板可以重載,運行時會自動匹配,見下圖
在這裏插入圖片描述
*__STL_FUNCTION_TMPL_PARTIAL_ORDER(不一定所有的linux系統都定義了該宏)
。。。這個不知道要說啥

*__STL_NON_TYPE_TMPL_PARAM_BUG
1、類模板在使用時支持設置默認參數和缺省傳參

臨時對象的產生於運用:
1、好處:刻意製造時方便程序員操作
壞處:在傳遞時會造成內存空間的佔用與浪費
2、Eg:
普通類型 int(8);
模板類型 vector(其他的數據類型變量)

靜態常量的類內初始化問題
1、Static 整型const變量在類內可以直接初始化(g++、vs均支持)
2、static 非const變量不可在類內初始化
3、static 浮點型 const變量在類內初始化時,g++可運行,vs編譯失敗

Operator關鍵字與重載++、–、()、<<、>>
1、重載++、–注意返回值與佔位參數
2、類內重載()後蓋類就變成了一個仿函數(用法:類名())
Struct是一個特殊的類,內部所謂成員均默認爲public
類名首字母要大寫。
3、<<、>>的重載只能寫在類的外部,方便審美

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章