函数模板
1函数模板
背景
在一个int型数组中,查找最大的数。。。
int findmax (int arr[], int len)
{
int val = arr[0];
for(int i=1; i<len ; i++)
{
if(arr[i] > val) val = arr[i];
}
return val;
}
背景
在一个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> ,表示把int 类型代入模板。
(联想一下“情书生成器”“西太平洋大学文凭生成器” )
函数模板
由于C/C++里的,空白是不影响最终编译结果的,所以以下两个 风格结果是一样的。
第一种风格:(推荐风格)
template < typename T> T findmax (T arr[], int len)
{
}
第二种风格:
template < typename T> T findmax (T arr[], int len)
{
}
小结
(1)使用函数模板的好处:相同的算法就不用重复的写多 遍了。简化了代码。
(2)函数模板用于实现通用的算法 generic algrithm。有 的教程上称为泛型算法。“通用算法”
(3)通常,我们更多的是调用人家写好的函数模板,很少 自己去写一个模板。
2模板相关的问题
问题列表
- 区分“模板参数”与“函数参数”
模板参数 template <typename _T1, typename _T2>
通常是一个类型的名字,如int, double, Object,Student - 模板的语法检查
模板在代入时才能真正地检查语法是否正确。(操作符重 载。。。) - 模板通常定义在头文件里
- 模板参数可以多个
3类模板
背景
需求:
写一个可变长度的数组类 Array
用途于存放若干元素,个数未知
设计:
内部动态申请一个buffer
capacity: 表示buffer的大小
size: 表示buffer中已经存放元素的个数
背景
接口:
Size(); 得到当前一个有多个元素
Capacity(): 最大容量
Clear(); 清空,使size为0, capacity不变
PushBack(): 附加一个元素
重载操作符[]:返回第几个元素(像数组一样操作它)
问题:这个类只适用于存放double型元素,如果要存放 char,float,int,以至于任意类型呢?
类模板
template < typename T>
class Array
{
};
使用类模板,就可以适用于不同元素类型,避免创建多个很 类型的类。
否则,要为每种类型创建一个类,例如:IntArray, DoubleArray…太麻烦了
类模板
使用方法:
Array< double> arr(4); // 创建array,初始capacity为4
可以把Array< double>合起来看成一个类名
使用这个对象的方法和普通对象没有特别之处:
arr.PushBack(123);
arr.PushBack(456);
int size = arr.Size();
arr[0] = 100;