C++模板包括:函数模板,类模板
函数的模板是一个通用函数,我们可以先不指定返回值类型和形参类型。
把模板的通用类型T用到函数的返回值和行参类型
T func(T a)
相当于把返回值和形参类型设置成了变量T。
template<typename T> //创建模板
void mySwap(T &a,T &b) // 创建模板之后面要写函数的声明或者定义.
{
T temp = a;
a = b;
b = temp;
}
3.1正常函数实现整形和double型交换
//实现两个整型交换的函数
void swapInt(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
void swapDouble(double &a,double &b)
{
double temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
swapInt(a,b);
double c = 1.1;
double d = 1.2;
swapDouble(c,d);
return 0;
}
3.2模板函数实现整形和double型交换
// 函数模板
template<typename T> // 声明一个模板,并设置模板中的T为通用类型
void mySwap(T &a,T &b)
{
T temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
//1.调用方法1: 自动类型推导
mySwap(a,b);
//2.调用方法2: 显示指定模板类型,此处指定模板的通用类型T的类型为int
mySwap<int>(a,b);
double c = 1.1;
double d = 1.2;
//1.调用方法1: 自动类型推导
mySwap(c,d);
//2.调用方法2: 显示指定模板类型,此处指定模板的通用类型T的类型为int
mySwap<double>(c,d);
return 0;
}
2.模板必须确定出T的数据类型,才可以使用.
由于没有指定func()的数据类型,所以后面调用的时候编译错误。
改成如下代码才可以:
#include
using namespace std;
//交换元素
template<typename T>
void mySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
//排序
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<typename T>
void printElement(T &a,int len)
{
for (int i=0;i<len;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
//测试char类型数组
void testChar()
{
char charArr[] = "badcfe";
int num = sizeof(charArr) / sizeof(char);
mySort(charArr,num);
printElement(charArr,num);
}
//测试int类型数组
void testInt()
{
int arr[] = {3,2,1};
int num = sizeof(arr) / sizeof(int);
mySort(arr,num);
printElement(arr,num);
}
int main()
{
testChar();
testInt();
return 0;
}