模板是c++中对类型参数化的工具;
有2种形式:函数模板和类模板;
函数模板针对参数类型不同的函数;
类模板针对数据成员和成员函数类型不同的类;
假设要求2个变量的最大值,可以通过重载方式实现;
int max ( int a, int b) ;
float max ( float a,float b);
double max( double a ,double b);
在学了类之后,还可以将类带进去, Demo max ( Demo &d1 , Demo &d2); 要比较2个对象的大小,还要重载运算符 < 或 >;
这样我们就要定义很多的函数,为了减少代码量,就可以使用c++的模板来解决这个问题了;
注意:要使用模板,必须在全局范围、或命名空间以及类范围内进行声明或者定义;
不能在局部范围,函数内进行;
函数模板:
1 定义格式:
template<class 形参1,class 形参2 ... > 返回类型 函数名(参数列表)
{
函数体;
}
注意事项:
① 用关键字template来引出;
② 模板形参:<> 里面的参数为模板形参,和普通的函数形参类似,只不过这里的是属于自定义的;可以用在需要数据类型的地方;用class 或者 typename 来引出;模板形参不能为空;表示的是一种未知的数据类型;
③ 形参个数根据需要可以定义多个;
2 模板函数的调用
在调用模板函数的时候,指定具体的数据类型(模板实参)来初始化模板形参,此时模板类中用到模板形参的都会被指定的数据类型代替;
类模板:
1 定义格式:
template<class 形参1, class 形参2...> class 类名
{
数据成员;...
成员函数;...
}
其中的数据成员及成员函数用到数据类型的都可以用声明的形参来代替;
2. 类模板对象的创建:
不同于普通类创建对象,类模板创建对象的时候,要在类名后加<>,并指定数据类型,这样类中用到模板形参的地方都会被相对应的指定的数据类型来代替;
还要注意,创建对象的时候,<>里添加的必须是数据类型,而不是具体数据类型的值;
3 在模板类外面定义成员函数:
template <模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){ 函数体};
其中,类模板实例化后的类,被称为模板类;同样,实例化后的函数模板,被称为模板函数;
STL:(standard template library 标准模板库)
惠普实验室开发的一系列的软件的统称;
从广义上主要分三类:
Algorithm (算法)
Container (容器)
Iterator (迭代器)
他们几乎所有的代码都是采用了模板类和模板函数的方式;
模板库的学习,可以借助c++函数手册来进行研究;
关于算法的的部分:
主要涵盖在了
关于容器的部分:
列表------比较适合插入删除等操作
关于迭代器的部分:
迭代器通常会跟容器及算法混合在一起使用,主要是进行元素的遍历;
练习:
算法举例:
Template:
template
{
T c(a);
a=b;
b=c;
}
容器:
Vector
template < class T, class Allocator = allocator
构造函数:
访问修改元素:
特性:
添加、删除、插入元素:
List:
template < class T, class Allocator = allocator > class list;
与vector相比,list的特点就是可以快速的插入和删除元素,遍历可以正向和反向;
构造方法: 与vector一样;
List和vector的一些区别:
相同: 2者都属于序列容器,元素按照一定的序列进行排列
不同:
Vector: 矢量容器又被称为动态数组,对于元素的操作可以向数组一样进行;与数组不同的是,可以根据需要实现扩展或收缩;但是比较耗内存;
Vector在元素查询方面更擅长;
List:是按照线性序列排列,具有双向链表的特点,容器内元素之间存在关联;
其优点:有效的插入和清除容器中的任何元素;有效的移除元素和容器内的元素块,甚至在容器之家;