作用:建立一个通用的函数,其函数返回值的类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
1.1.1函数模板语法
语法:template<typename T>
函数声明或定义
#include<iostream>
//#include<string>
using namespace std;
//交换两个整形函数
//void swapInt(int &a, int &b)
//{
// int temp = a;
// a = b;
// b = temp;
//}
// 交换两个浮点型函数
//void mySwap(float &a, float &b)
//{
// float temp = a;
// a = b;
// b = temp;
//}
//利用函数模板
template<typename T> //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用数据类型
void mySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
void test01()
{
int a = 10;
int b = 20;
//swapInt(a, b);
//两种方式使用函数模板
//1.自动类型推导
//mySwap(a, b);
//2.显示指定类型
mySwap<int>(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
float c = 1.1;
float d = 2.2;
/*mySwap(c, d);*/
/*cout << "c=" <<c<< endl;
cout << "d=" <<d << endl;*/
}
int main()
{
test01();
return 0;
}
总结:
- 函数模板利用关键字template
- 使用函数模板有两种方式:自动类型推导,显示指定类型
- 模板的目的是为了提高复用性,将类型参数化
1.1.2函数模板注意事项
- 自动类型推导,必须推导出一致的数据模型 T,才可以使用
- 模板必须要确定出T的数据模型,才可以使用
#include<iostream>
//#include<string>
using namespace std;
template<class T>
void mySwap(T&a, T&b)
{
T temp = a;
a = b;
b= temp;
}
//1.自动类型推导,必须推导出一致的数据类型 T,才可以使用
void test01()
{
int a = 10;
int b = 20;
char c= 'c';
//mySwap(a, b);//正确
//mySwap(a, c);错误,推导不出一致的T类型
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
//2.模板必须要确定出T的数据类型,才可以使用
template<class T>
void func()
{
cout << "func调用" << endl;
}
void test02()
{
func<int>();
}
int main()
{
//test01();
test02();
return 0;
}
注:使用模板时必须确定出通用的数据类型T,并且能够推导出一致的数据类型
1.1.3函数模板案例
- 利用一个函数模板封装一个排序的函数,可以对不同的数据类型数组进行排序
- 排序规则从小到大,排序算法为选择排序
- 分别利用char数组和int数组进行测试
#include<iostream>
//#include<string>
using namespace std;
template<class T>
void mySwap(T&a, T&b)
{
T temp = a;
a = b;
b= temp;
}
//排序算法(选择排序)
template<class 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++)
{
//认定的最大值 比遍历出的数值要小,说明j下标的元素才是真正最大值
if (arr[max] < arr[j])
{
max = j;
}
}
if (max != i)
{
//交换max和i元素
mySwap(arr[max], arr[i]);
}
}
}
//提供打印数组模板
template<class T>
void printArrry(T arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void test01()
{
//测试char 数组
char charArr[] = "abcdef";
int num = sizeof(charArr) / sizeof(char);
mySort(charArr, num);
printArrry(charArr, num);
}
void test02()
{
//测试int数组
int intArr[] = { 7,5,1,3,9,2,4,6,8 };
int num = sizeof(intArr) / sizeof(int);
mySort(intArr, num);
printArrry(intArr, num);
}
int main()
{
test01();
test02();
return 0;
}
(来自B站黑马视频)