有一點編程經驗和積累,想系統的學習下STL,之前都是隨意作的筆記,如今想着成主題的輸出一下。html
書的原型是ISBN:9787302421757 《C++泛型STL原理和應用》,是從圖書館借的國內大學教材,先把這個讀完了,若是有可能的話,就在相應的章節再寫一個plus版本。git
泛型(generic type):就是一種通用類型。算法
T max( T x, T y) {}
//這裏T是類型佔位符。編程
模板:除了須要聲明類型佔位符以外,其它內容應與目標實體代碼徹底相同。 聲明一個模板時,需在實體代碼前面,加一條說明語句。前面是template關鍵字。函數
函數模板學習
template<typename T, typename R, typename S> T max(R x, S y){}
.net
類模板指針
在聲明語句前加 template<typename T>
code
template<typename T>
早期也寫成 template<class T>
,但不支持這麼寫htm
C++11和14中,給關鍵字 auto 增長了新的語義,同時增長了 decltype表達式
auto關鍵字是爲自動推導數據類型所設 auto i=100;
以前auto只對系統的內置數據推薦有效,如今利用編譯器的類型記憶能力,能夠記住自定義的類型。
變量類型難以肯定的問題主要出如今函數的返回值上,所以函數的返回值類型的位置經常會出現auto關鍵字,稱爲 auto返回值佔位
auto Multiply(T t, U u)->decltype(t*u) {return t*u;}
把auto看作數據類型的話,auto其實也能夠算一種泛型,不過它無須關鍵字typename聲明。
C++新標準引入了變量模板的概念。pi<T>
【做者沒有介紹更多,能夠翻看C++11】
類型參數
以類模板做爲函數實參的例子 MyTest<Test1<int>>TT;
非類型參數
template <typename T,/*類型參數*/ int b/*非類型參數*/>
模板定義型參數
C++也容許以類模板的定義做爲類模板參數
須要的目的: 除了強調這個參數的實參必須爲類模板以外,還強調這個類模板所具備的參數個數。
函數模板實參的隱式提供
add<int>(45,46);
直接變成 add(45,46);
指針實參
在C++中,指針被看做一種數據類型。
見具體的代碼; 【做者沒有描述,我還沒太懂這部分】
修飾字const和&的使用
見具體的代碼示例; 【沒見過具體的應用場景】
特化(特列化)模板:爲有特殊算法要求的數據類型另行編寫模板
通用模板:門票10塊
特化模板:學生和老人半價
函數模板中的特化模板
在實體代碼前加如下聲明 tmplate<>
類模板的特化和偏特化
偏特化:只特化參數中的某一個或某幾個
偏特化模板的寫法 template<typename T2> struct Test<int,T2>{}
全特化模板的寫法 template<> struct Test<int,float>{}
由於有了以上泛型模塊的共存,編譯器就須要選擇一個生成實體模塊代碼,就有了規則。
具體的優先順序
特化模板(函數或類)
偏特化模板(函數或類)
普通模板(函數或類)
系統
轉移語義是C11推出的新概念和新技術。
右值: 只能出如今賦值運算符右邊。僅能表明數據;匿名,無固定地址的對象。
左值: 既能夠出如今賦值運算符左邊,又能夠出如今賦值運算符右邊。有名字,有固定地址的表達式
右值引用
C11以前有兩種表示方式 T& 別名 = lvalue;//引用
和 const T& 別名 = lvalue;//常引用
C11以後僅定義一種:const T& 別名 = rvalue;
強行爲右值命名一個變量名,目的就是爲延長右值生命期。
右值的很是量引用 T&& 名稱=rvalue;
深拷貝
淺拷貝
右值引用有好處後,左值也想利用,move的原型 T&& move(T& val);
參數轉發
1 完美轉發問題的提出及解決思路
2 模板參數類型推導規則--引用符摺疊規則
3 參數類型正確轉發的保證--forward()函數模板
static_cast()
:這個轉換隻對參數爲右值時有用。
C++11將static_cast()
封裝成函數模板std::forward,因而Func(forwad<T>(a));
《C++STL開發技術導引》 chap2 C++模板技術 P39/454
內容
2.4 函數模板重載 P44 編譯器調用規則
2.5 類模板繼承 P44
代碼到時再一塊兒提交。
問題
模板和宏是什麼關係?【lionel]
2017-01-14兩個番茄鍾:1.1節理解並代碼完成,1.2節剛開始看
C++新標準引入了變量模板的概念。pi<T>
【做者沒有介紹更多,能夠翻看C++11】
以類模板做爲函數實參的例子,簡單的能看懂,但到真實應用場景中,目前還真說很差。
2017-01-15兩個番茄鍾:1.2和1.3節理解並代碼完成
目前這些只是知道了,還沒徹底記住,更不清楚應用場景。
2017-01-16兩個番茄鍾:1.4結束
這部分只是按課本看了,並無徹底消化掉,須要再回來看看。
是否是得結合C++11來一塊兒翻看?【lionel】
2017-01-17 看了下《C++STL開發技術導引》中的chap2