c++函数模板(数组作为模板参数)

前提要有函数的模板,学习如何写模板函数可以看我的上一篇博客,其中有详细讲述如何写出一个简单易懂的函数模板。

用函数模板生成实际可执行的函数称为模板函数。函数模板和模板函数不是一个概念。从本质上讲,函数模板是一个“框架”,它并不是一个真正可以编译生成代码的程序,而模板函数是把函数模板中的类型参数实例化后生成的函数(方便了我们对不同数据的处理),它和普通函数本质是相同的,可以生成编译器可以执行的代码。

现在开始这篇博客的正式内容,使用数组作为模板参数:

代码如下:

#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语言中的一些细节问题,例如函数返回值如何应用,如何返回多个数据,以及指针方面的应用。

指针真的很重要        很重要        很重要!!!

  • 5
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论 2

打赏作者

小侯不躺平.

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值