函数模板

函数模板


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模板相关的问题

问题列表

  1. 区分“模板参数”与“函数参数”
    模板参数 template <typename _T1, typename _T2>
    通常是一个类型的名字,如int, double, Object,Student
  2. 模板的语法检查
    模板在代入时才能真正地检查语法是否正确。(操作符重 载。。。)
  3. 模板通常定义在头文件里
  4. 模板参数可以多个
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;

学习资源 《C语言/C++学习指南》语法篇(从入门到精通)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值