第八章 模板

一 实验目的

1、能够使用C++模板机制定义重载函数。

2、够实例化及使用模板函数。

3、能够实例化和使用模板类。

4、应用标准C++模板库(STL)通用算法和函数对象实现查找与排序。


二 实验内容

1.分析并调试下列程序,了解函数模板的使用。

  1. #include<iostream>  
  2. using namespace std;  
  3. template <class T>  
  4. T max(T a,T b)  
  5. {  
  6.     return a>b?a:b;  
  7. }  
  8. int max(int a,int b)  
  9. {  
  10.     return a>b?a:b;  
  11. }  
  12. int main()  
  13. {  
  14.     cout<<"max(6,5)is"<<max(6,5)<<endl;  
  15.     cout<<"max('6','5')is"<<max(6,5)<<endl;  
  16.     return 0;  
  17. }  

(1)写出运行结果,分析编译系统工作过程。


(2)如果定义函数重载,代码如下:

[cpp] view plain copy
  1. int max(int a,int b){return a>b?a:b;}  
  2. float max(float a,float b){return a>b?a:b;}   

如果程序中有max('6','5');调用时会出现什么结果?为什么?上机调试并分析原因。

2、分析并调试 下列程序,了解特定模板函数的作用。

  1. #include<iostream>  
  2. using namespace std;  
  3. template<typename T>  
  4. T max(T a,T b)  
  5. {  
  6.    return a>b?a:b;  
  7. }  
  8. char *max(char *a,char *b)  
  9. {  
  10.     return strcmp(a,b)>0?a:b;  
  11. }  
  12. int main()  
  13. {  
  14.     cout<<"max(6,5)is"<<max(6,5)<<endl;  
  15.     cout<<"max(\"China\",\"Japan\")is"<<max("China","Japan")<<endl;  
  16.     return 0;  
  17. }  
(1)写出运行结果。

(2)说明特定模板函数的作用。

3、声明一个类模板,利用它实现10个整数、浮点数和字符的排序。

[cpp] view plain copy
 
  1. #include<iostream>  
  2. using namespace std;  
  3. template <class T>  
  4. class MySort  
  5. {  
  6. public:  
  7.     MySort(T _stores[10])  
  8.     {  
  9.         stores = _stores;  
  10.     }  
  11.     void DoSort(bool up = true)  
  12.     {  
  13.         for(int i = 0; i < 10; i++)  
  14.         {  
  15.             for(int j = i+1; j < 10; j++)  
  16.             {  
  17.                 if(up)//升序  
  18.                 {  
  19.                     if(stores[i] > stores[j])  
  20.                     {  
  21.                         T temp = stores[i];  
  22.                         stores[i] = stores[j];  
  23.                         stores[j] = temp;  
  24.                     }  
  25.                 }  
  26.                 else//降序  
  27.                 {  
  28.                     if(stores[i] < stores[j])  
  29.                     {  
  30.                         T temp = stores[i];  
  31.                         stores[i] = stores[j];  
  32.                         stores[j] = temp;  
  33.                     }  
  34.                 }  
  35.             }  
  36.         }  
  37.     }  
  38. private:  
  39.     T *stores;  
  40. };  
  41.   
  42. int main()  
  43. {  
  44.     //int  
  45.     int nums[10];  
  46.    cout<<"输入10个整数:"<<nums[10]<<endl;  
  47.     for(int i = 0;i<10;i++)  
  48.        cin>> nums[i];  
  49.     MySort<int> mySort(nums);  
  50.     mySort.DoSort(true);//升序  
  51.     for(int i = 0; i < 10; i++)  
  52.         cout<<nums[i]<<endl;  
  53.   
  54.     //float  
  55.     float nums1[10];  
  56.     cout<<"输入10个浮点数:"<<nums1[10]<<endl;  
  57.     for(int i = 0; i < 10; i++)  
  58.        cin>>nums1[i];  
  59.     MySort<float> mySort1(nums1);  
  60.     mySort1.DoSort(false);  
  61.     for(int i = 0; i < 10; i++)  
  62.          cout<<nums1[i]<<endl;  
  63.   
  64.     // char  
  65.     char chars[10];  
  66.     cout<<"输入10个字符:"<<chars[10]<<endl;  
  67.     for(int i = 0; i < 10; i++)  
  68.        cin>>chars[i];  
  69.     MySort<char> mySort2(chars);  
  70.     mySort2.DoSort();  
  71.     for(int i = 0; i < 10; i++)  
  72.         cout<<chars[i]<<endl;  
  73.   
  74.     return 0;  
  75. }  

运行结果如下:


4、声明一个整型数组,使用C++标准模板库(STL)中的查找算法find()进行数据的查找,然后应用排序算法sort()对数据进行升序和降序排序。

#include<iostream>   #include<vector>   #include<algorithm>   using namespace std;      bool  largeThan(int x,int y)   {       return x>y;   }   int main()   {       int a[7]={4,8,3,9,5,1,7};       size_t arrSize=7;       int searchValue=5;       vector<int> vec(a,a+arrSize);       vector<int>::iterator it=find(vec.begin(),vec.end(),searchValue);       if(it==vec.end())           cout<<"not found"<<endl;       else           cout<<searchValue<<"'s index is "<<(it-vec.begin())<<endl;       //升序       sort(vec.begin(),vec.end());       for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)           cout<<*it<<ends;       cout<<endl;          //降序;       sort(vec.begin(),vec.end(),largeThan);       for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)           cout<<*it<<ends;       cout<<endl;   }  

运行结果如下:


三 分析与讨论

1、结合实验中第1题和第2题,说明编译器匹配函数的过程。

2、结合实验中第3题和第4题,比较利用自定义类模板排序和使用C++标准模板库排序的过程。

猜你喜欢

转载自blog.csdn.net/qq_41797872/article/details/80690731