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, 迭代器

用于分离算法和容器 智能指针

相关文章
相关标签/搜索