函数模版
背景:
在一个double型数组中,查找最大的数;
在一个float型数组中,查找最大的数;
在一个Object[]数组中,查找最大的元素。
算法都是一样的,遍历数组,找出最大值,只是元素的类型不一样而已。如果每一种算法都重载了一个findmax函数,是否有点太笨拙了呢?
- 模版,template:定义一个算子,自动适应各个类型。
- 语法:
template<typename T>
T findmax(T arr[], int len){
T val = arr[0];
...
}
算法相同,元素类型不同,用T代替
- 函数模版的使用
使用时,用<>来具体指定typename的类型
int main(){
int arr[4]={1,42,87,100};
int result = findmax<int> (arr,4);
return 0;
}
也就是说,在使用时函数名findmax,表示把int类型代入模版。
- 小结
- 使用函数模版的好处,相同的算法就不用重复的写多变了,简化了代码;
- 函数模版用语实现通用的算法generic algorithm,有的教程上称为范性算法;
- 通常,我们更多的是调用人家写好的函数模版,很少自己去写一个模版。
类模板
背景:
需求:写一个长度可变的数组类Array,用途于存放若干个元素,个数未知;
设计:内部动态申请一个buffer,capacity:表示buffer的大小,size表示buffer中已经存放元素的个数;
接口:Size():得到当前一个有多个元素;Capacity():最大容量;Clear():清空,使size为0,capacity不变;Pushback():附加一个元素;重载操作符[]:返回第几个元素;
问题:如果这个类只适用于存放double型元素,如果要存放char,float,int,以至于任意类型呢?
template <typename T>
class Array{
...
};
使用类模板时,就可以适用于不同元素类型,避免创建多个类型的类。否则,要为每种类型创建一个类。
- 类模板的使用:
Array<int> a;
Array<double> arr(4); //创建array,初始Capacity为4。