STL與泛型編程 -- 第一週學習筆記(Boolan)

1, 模板觀念與函數模板算法

簡單模板:
template< typename T > T Function( T a, T b) {… }函數

類模板:
template struct Object{……….};
函數模板
template< class T> inline T Function( T a, T b){……}
不可使用不一樣型別的參數來調用函數模板優化

可使用class代替typename. 但不能使用struct代替typename指針

使用具體類型代替模板參數T叫實例化, 從而產生一個模板實例. 編譯器

模板編譯過程: 
實際編譯兩次
1,沒有實例化前,檢查模板代碼自己檢查是否有語法錯誤
2,實例化期間,檢查模板代碼的調用是否合法it

模板編譯
1,類型必須嚴格符合,不可自動型別轉換.
2,若是真的要轉換,那麼須要使用static_cast< …>進行強制轉換.io

函數模板重載
1, 模板函數能夠像普通函數同樣被重載
2, 非模板函數能夠和同名模板函數共存
3, 編譯器經過函數模板參數推導來決定使用哪一個重載
其餘因素相同的狀況下,重載裁決過程調用非模板函數.
(不然編譯器還須要本身在實例化一套代碼)編譯

Max<>(7,32) 調用Max容許空模板參數
Max(2,3) 顯式指定模板實參類型ast


2, C++類模板 模板


template < typename T, size_t n = 1024> class Stack{……..};

a,關鍵字 typename 和class 均可使用
b,在模板內, T能夠像int,char同樣 定義成員變量和成員函數
c,除了Copy constructor以外, 若是在類模板內須要使用到這個類自己,如定義operator=,那麼應該使用其完整定義(Stack)
Stack& operator=( Stack < T,n> const & );

類模板的使用:
1,Stack s;
2,Stack< int,100> s;
1,Stack< Stack > s; 定義一個Stack的Stack , 此處必須有一個空格, 不然編譯器會覺得是>>操做符


3, 類模板特化


template<>
class Stack{……};
可能能夠作些特別的優化或者提供不一樣的實現
避免在實例化某些類時,引發一些可能產生的詭異行爲


4, 類模板偏特化


主模板:
template< typename T1, typename T2> class MyClass{…};
偏特化:

2
template< typename T> class MyClass< T,T>{…};
3
template< typename T> class MyClass< T,int>{…};
4
template< typename T1, typename T2> class MyClass< T1*,T2*>{…};

若是有不止一個偏特化同程度的能匹配某個調用,那麼該調用具備二義性,ERROR.
如 :
MyClass< int, int> obj; 知足 MyClass< T,T> 和 MyClass< T,int>
MyClass< int*, int*> obj; 知足 MyClass< T1*,T2* > 和 MyClass< T,T>


5, 默認模板實參


template< typename T, typename Tcons = std::vetor< T> > class Stack{…};


6, 操做符重載


除了 operator= ,其餘操做符均可以被重載.

7, 特性(Traits) - 重點
8, 迭代器

用於分離算法和容器 智能指針

相關文章
相關標籤/搜索