模板概论
C++提供了函数模板,所谓函数模板。实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。
凡是函数体相同的函数都可以使用这个模板代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。
C++提供两种模板机制:函数模板和类模板。
模板把函数或者类要处理的数据类型参数化,表现为参数的多态性,成为类属(类型参数化,又称参数模板)。
模板用于表达逻辑结构相同,但是具体数据元素类型不同的数据对象的通用行为。
函数模板
//交换int数据
void SwapInt(int& a,int& b){
int temp = a;
a = b;
b = temp;
}
//交换char数据
void SwapChar(char& a,char& b){
char temp = a;
a = b;
b = temp;
}
//问题:如果我要交换double类型数据,那么还需要些一个double类型数据交换的函数
//繁琐,写的函数越多,当交换逻辑发生变化的时候,所有的函数都需要修改,无形当中增加了代码的维护难度
//如果能把类型作为参数传递进来就好了,传递int就是Int类型交换,传递char就是char类型交换
//我们有一种技术,可以实现类型的参数化---函数模板
//class 和 typename都是一样的,用哪个都可以
//template<typename T>
template<class T>
void MySwap(T& a,T& b){
T temp = a;
a = b;
b = temp;
}
int main(){
int a = 10;
int b = 20;
cout << "a:" << a << " b:" << b << endl;
//1. 这里有个需要注意点,函数模板可以自动推导参数的类型
MySwap(a,b);
cout << "a:" << a << " b:" << b << endl;
char c1 = 'a';
char c2 = 'b';
cout << "c1:" << c1 << " c2:" << c2 << endl;
//2. 函数模板可以自动类型推导,那么也可以显式指定类型
MySwap<char>(c1, c2);
cout << "c1:" << c1 << " c2:" << c2 << endl;
}
用模板是为了实现泛型,可以减轻编程的工作量,增强函数的重要性。
//模板打印函数
template<class T>
void PrintArray(T arr[],int len){
for (int i = 0; i < len;i++){
cout << arr[i] << " ";
}
cout << endl;
}
//模板排序函数
template<class T>
void MySort(T arr[],int len){
for (int i = 0; i < len;i++){
for (int j = len - 1; j > i;j--){
if (arr[j] > arr[j - 1]){
T temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
}
}
}
int main(){
//char数组
char tempChar[] =