1、template 模板类
模板特点:
在模板编程中,对于没有调动的函数部分,不会参与编译
模板参数分为:
类型、非类型、其他模板类型
申请空间不要使用new,而要使用malloc
另外:new在申请空间失败的时候是抛出一个异常,不是返回空指针
非类型参数(替换规则):
类型参数是重命名规则
模板类的特化:
泛型:
所有的类型都可接收,但不接收模板类型
部分特化:
只接收指针类型
完全特化:
只接收 char* 类型
模板源编程原理:
部分特化有一定的类型萃取,萃取出原始类型,将 & 型别剥离
2、template 模板函数
特点:
由实参推演、确定形参的类型
推演过程(在编译时完成):
using T = int、 Max<int>
非模板类函数:
模板类函数:
新概念:引用类型未定义。具体得看实参,根据实参确定T、x的类型,也不属于万能引用。
template< class T >
void func(T && x){ ... }
拓展点:完美转发
函数模板的特化:
没有泛型母版的存在,就不存在特化版本;
完全特化就用指定类型全部替换T即可,特化时保持原有特性不变。没有泛型母版,特化就没有依据
3、STL容器类
构造函数中:
移动构造、移动赋值(一般在有堆区空间、或文件资源的时候会使用到)
希望a中的资源全部移到b中,使用移动;先释放b资源,再把a资源移动到b资源,然后释放a资源
希望a、b资源最终相同,可以使用赋值;
原位构造函数(重要):
关于vector中的reserve和resize区别:
vector如何提高效率:大致估算所需要的空间数量,然后reserve
List双链表:
问题思考:什么时候用List、vector、map?
map
equal_range
lower_bound
upper_bound
多重map
允许关键码相同,相同时在右侧插入