分为函数模板与类模板
1、函数模板
作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
语法:
解释:
template 声明创建模板
typename 表明其后面的符号是一种数据类型,可以用class代替
T 通用的数据类型,名称可以替换,通常用大写字母
//整形交换函数
void trans(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
//浮点型交换
void swith(double &a, double &b)
{
double temp = a;
a = b;
b = temp;
}
//函数模板
template<typename T> //声明一个模板,让T不要报错
void myswap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
void test1()
{
double a = 10; double b =254.5;
//利用模板
//1.自动类型推导
//myswap(a, b);
//2.显示制定类型
myswap<double>(a, b);
cout << a << endl;
}
int main()
{
test1();
system("pause");
return 0;
}
2.函数模板注意事项
emplate<typename T> typename可换成class
template<class T> //声明一个模板,让T不要报错
void func()
{
cout << "模板" << endl;
}
void test1()
{
double a = 10; double b =254.5;
//利用模板
//1.自动类型推导
//myswap(a, b);
//2.显示制定类型
myswap<double>(a, b);
cout << a << endl;
func<int>(); //因为没用到T,所以随便制定一个类型,使模板可以使用
}
3.案例
- 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序
- 排序规则从大到小,选择排序
- 分别利用char和int数组进行排序
自己写的一个冒泡排序
template<class T> //声明一个模板,让T不要报错
void mysort(T *arr,T len) //数组冒泡排序模板,只用穿数组首地址就行,不要穿两个地址
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
void test1()
{
int arr[10] = { 10,54,88,675,4,0,3030,92,654,300 };
for (int i = 0; i < 10; i++)
{
int *p1 = arr; int len = sizeof(arr) / sizeof(arr[0]);
mysort<int>(p1,len);
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << "\n" << endl;
}
}
老师写的
//函数模板
template<class T> //声明一个模板,让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和j元素
int temp;
temp = arr[max];
arr[max] = arr[i];
arr[i] = temp;
}
}
}
void test1()
{
char chararr[] = "abdudks";int arr[10] = { 10,54,88,675,4,0,3030,92,654,300 };
int len = sizeof(chararr) / sizeof(chararr[0]);
int num = sizeof(arr) / sizeof(arr[0]);
mysort<char>(chararr, len);
/*for (int i = 0; i < 10; i++)
{
cout << chararr[i] << " " << endl;
}*/
mysort<int>(arr, num);
for (int i = 0; i < 10; i++) //模板
{
cout << arr[i] << " " << endl;
}
}
int main()
{
test1();
system("pause");
return 0;
}
4.普通函数与模板的区别(视频171,172暂时没做笔记,之后补上)
自动类型推导不会发生隐式类型转换
显示制定类型有隐式类型转换