
一、函数模板的引出: 1、c++中有几种交换变量的方法: (1)定义宏代码块 (2)定义函数 代码版本一: #include <iostream>#include <string> using namespace std; #define SWAP(t,a,b) \ do \ { \ t c =a; \ a =b; \ b = c; \ }while(0) int main() { int a =2; int b =5; SWAP(int , a , b ); cout<<"a= "<<a<<endl; cout<<"b= "<<b<<endl; double m =4; double n =6; cout<<"m = "<<m<<endl; cout<<"n= "<<n<<endl; return 0; } 输出结果: root@txp-virtual-machine:/home/txp# ./a.outa= 5 b= 2 m = 4 n= 6 注解:我们看两个数值交换成功。 我们再用使用函数的方式来实现这个功能,当然以前我们在c语言里面使用指针传参方式来实现这种两个数值直接的交换,现在我们利用c++里面更加高级的方式来实现,就是使用引用来实现(不过它的本质还是指针来实现,只是我们只用引用再不用去考虑指针的细节了) 代码版本二: #include <iostream>#include <string> using namespace std; void Swap(int& a , int& b )//const int * a ,const int * b ' { int c =a; a=b; b=c; } void Swap(double& a,double& b) { double c =a; a=b; b=c; } void Swap( string& a, string& b) { string c =a; a=b; b=c; } int main() { int a =2; int b =5; Swap(a,b); cout<<"a= "<<a<<endl; cout<<"b= "<<b<<endl; double m =4; double n =6; cout<<"m= "<<m<<endl; cout<<"n= "<<n<<endl; string d = "Txp"; string t = "xiaoping"; cout<<"d= "<<d<<endl; cout<<"t= "<<t<<endl; return 0; } 输出结果: root@txp-virtual-machine:/home/txp# ./a.outa= 5 b= 2 m= 4 n= 6 d= Txp t= xiaoping 注解:同样实现了交换功能。 2、两种方法的优缺点: 定义宏代码块 -优点:代码复用,适合所有的类型 -缺点:编译器不知道宏的存在,缺少类型检查 定义函数 -优点:真正的函数调用,编译器对类型进行检查 -缺点:根据类型重复定义函数,无法diam复用,从上面的试验结果可以看出,我们每次都对Swap()函数进行重新定义,定参数的类型不一致的时候 二、泛型编程闪亮出场: 1、泛型编程的概念: 不考虑具体数据类型的编程方式,我们可以继续拿我们刚才的那个Swap函数进行改造,改成我们现在的泛型写过: void Swap(T& a, T& b){ T t =a; a =b; b =t; } 注解:Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型,这一点非常重要,明显有了很大提升。 2、C++中泛型编程 (1)函数模板:
void Swap(T& a, T& b) { T t = a; a = b; b = t; } (2)函数模板的语法规则:
![]() (3)函数模板的使用
int b =1; Swap(a,b)//这里属于自动推导 float c =2; float d =6; Swap<float>(c,d);//这里属于显示调用 代码实践: #include <iostream>#include <string> using namespace std; template < typename T >// 开始泛型编程,泛指类型是 T;在下面函数定义中用 T 可以代表类型; void Swap(T& a, T& b) { T c =a; a=b; b=c; } template < typename T > void Sort(T a[], int len) { for(int i=0;i<len;i++) { for(int j=i;j<len;j++) { if(a > a[j]) { Swap(a,a[j]); } } } } template < typename T > void Println(T a[], int len) { for(int i=0;i<len;i++) { cout<<a<<","; } cout<<endl; } int main() { int a=3; int b=5; Swap(a,b);//自动推导,等价于 Swap<int>(a, b); cout<<"a= "<<a<<endl; cout<<"b= "<<b<<endl; double m =4; double n=6; Swap(m,n); cout<<"m= "<<m<<endl; cout<<"n= "<<n<<endl; string d = "Txp"; string t ="xiaoping"; Swap<string>(d,t);//显示指定;将 T 替换成 string,然后进行调用; cout<<"d= "<<d<<endl; cout<<"t= "<<t<<endl; /* 以下是选择排序算法测试代码 */ int array[5]={3,5,6,4,9}; Println(array,5); Sort(array,5); Println(array,5); string s[5]={"c","c++","rust","golang","python"}; Println(s,5); Sort(s,5); Println(s,5); return 0; } 输出结果: vroot@txp-virtual-machine:/home/txp# ./a.outa= 5 b= 3 m= 6 n= 4 d= xiaoping t= Txp 3,5,6,4,9, 3,4,5,6,9, c,c++,rust,golang,python, c,c++,golang,python,rust, 三、总结:
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 |