前提要有函数的模板,学习如何写模板函数可以看我的上一篇博客,其中有详细讲述如何写出一个简单易懂的函数模板。
用函数模板生成实际可执行的函数称为模板函数。函数模板和模板函数不是一个概念。从本质上讲,函数模板是一个“框架”,它并不是一个真正可以编译生成代码的程序,而模板函数是把函数模板中的类型参数实例化后生成的函数(方便了我们对不同数据的处理),它和普通函数本质是相同的,可以生成编译器可以执行的代码。
现在开始这篇博客的正式内容,使用数组作为模板参数:
代码如下:
#include<iostream>
using namespace std;
template <class type,int len>
type Max(type array[len])
{
type ret = array[0];
for(int i = 1;i < len; i++)
{
ret = (ret > array[i]) ? ret : array[i];
}
return ret;
}
int main()
{
int array[50] = {0}; //给数组赋初值,以防随机值太大
int n;
cout << "请输入整型元素个数:" << endl;
cin >> n; //获取元素个数
cout << "请输入整型元素:" << endl;
for(int i = 0;i < n; i++)
{
cin >> array[i]; //输入数组中的值
}
int ret = Max<int,50>(array); //50是数组的上限,不可以超过上限否则会溢出
cout << "整型数组中最大值为" << ret <<endl;
double arry[50] = {0}; //给数组赋初值,以防随机值太大
int x;
cout<<"请输入双精度元素个数:"<<endl;
cin>>x; //获取元素个数
cout<<"请输入双精度元素:"<<endl;
for(int i = 0;i < x; i++)
{
cin>>arry[i]; //输入数组中的值
}
double iret = Max<double,50>(arry); //50是数组的上限,不可以超过上限否则会溢出
cout<<"双精度度浮点型最大值为:"<<iret;
return 0;
}
如上的代码可以进行对数组求其最大值,数据类型可以改变且不用将一个函数多写很多遍,更改其的返回类型和参数类型,这大大减少了我们程序员的负担问题,同时也解决了我们寻找bug的问题,也可以减少修改的成分。
上面代码的运行结果如下:
数组排序模板
给数组排序的函数模板,该函数模板的应用的地址更改值的方式,所以不需要有返回的值,可以观察代码中的第二行可以看出我们使用地址去改变数组中的值。
template <class T,int len> //函数模板(给数组排序)
void classify(T (&a)[len]) //利用地址去更改数组中的值
{
int n = sizeof(a)/sizeof(*a); //计算数组的长度
for(int i = 0;i < n; i++)
{
for(int j = 0;j < n;j++)
{
if(a[j]>a[i])
{
T temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
template<class T,int len>
void print(T(&a)[len]) //函数模板(输出排好序的数组)
{
cout << "数组从小到大的顺序是:" << endl;
int n = sizeof(a)/sizeof(*a);
for(int i = 0;i < n; i++)
{
cout << a[i] <<" ";
}
cout<<endl;
}
int main()
{
int num[7]={45,25,15,1,47,14,9};
classify(num); //调用模板函数
print(num);
return 0;
}
以上的代码主要是利用了地址更改来传递排好序的数组。
还可以将更换数组值的代码另写一个函数如下:
template<class T>
void Swap(T &a,T &b)
{
T temp = a;
a = b;
b = temp;
}
则利用这个方式时,将排序的部分可以直接利用该模板函数来进行交换数据,但是排序的模板函数中的参数列表需要更改,改为如下即可:
template<class T>
void classify(int array[] ,int len)
{
... //函数体和原来的代码相同
}
在此本篇博客就此结束了,求求大佬给一些专业性的建议,本人编程小白想要吸取一些大佬们的建议来提升自己,本人觉得如果要深入学习的话一定要学好c语言中的一些细节问题,例如函数返回值如何应用,如何返回多个数据,以及指针方面的应用。
指针真的很重要 很重要 很重要!!!