函数是实现某种功能的存在,每个程序的编写都离不开函数,没需要实现一个功能往往都需要自定义一个函数,但有时候会发现,当需要实现的功能相似时,就会出现两个类似但又不能共用的函数,所以在C++中就存在着函数模板让这种类似的函数尽可能少的出现。接下来通过一个对数组排序的案例应用函数模板。
案例:实现用一个函数对不同类型的数组进行降序排序并把数组打印,算法要求:选择排序
首先测试字符类型数组,定义一个函数,在函数里定义一个无序的字符数组,如下:
void test01()
{
//测试char数组
char charArr[] = "badcfe";
}
接着编写一个对数组进行降序排序的选择排序函数模板,如下:
template<typename T>
void mySort(T arr[],int len)
{
for (int i = 0; i < len; i++)
{
int max = i;//最大值
for (int j = i + 1; j < len; j++)
{
if (arr[max] < arr[j])
{
max = j;//更新最大值下标
}
}
if (max != i)
{
//交换max和i
mySwap(arr[max], arr[i]);
}
}
}
可以看到要编写一个函数模板,首先要在函数前加上template,T为参数列表里的参数类型,是一个通用的数据类型,T与C#中的泛型相似,参数列表有几个未明确数据类型且数据类型不同的参数就有几个T,用逗号隔开,如:template<typename T,typename T>。对数组进行排序只需要数组和数组长度两个参数,数组长度是确定的int类型,所以只需要一个T来作为数组的类型。函数体里面就是选择排序的实现代码。由于当前函数是一个函数模板,没有明确的数据类型,所以下面的两个数据交换也需要编写一个函数模板实现两个数据交换。如下:
template<typename T>
void mySwap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
因为要实现两个数据交换所以有两个参数,函数体里定义一个T类型的变量并把a赋值给该变量,接着把b赋值给a,最后把temp赋值给b就完成了交换。
函数模板编写完了,接下来调用函数模板来测试对数组的排序,如下;
在主函数main调用test01后的输出结果如下:
可以看到字符已经是降序排序成功了,字符的排序是以ASCII码作为依据来排序的,接下来测试整形的数组,如下:
输出如下:
以上就是通过函数模板对数组进行排序的实现