1.平时我们在写一个函数交换的时候,常用语法
我们可以发现其会非常繁琐,在不同的数据类型之间还是要重新定义,工作量较大
#include<iostream> using namespace std; 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; }
2.在这里时我们要学习一个新的模板函数
template<typename T> void myswap(T& a, T& b) { T temp = a; a = b; b = temp; } int main() { int a = 10; int b = 20; myswap(a, b); myswap<int>(a, b); /// <summary> /// myswap<int> (&:a,&:b)表示显示出转换的类型 /// </summary> /// <returns></returns> cout << "a=" << a << endl; cout << "b=" << b << endl; return 0; }
3.函数模板的注意事项
A.必须确定出是相同的数据类型,才可以在一个函数当中同时使用多个变量
B.模板必须要确定出具体的数据类型,才可以进行使用
template<class T> //在这里typaname可以替换为class
4.函数模板案例------数组排序
选择排序
public int[] choiceSort(int[] arr){ for(int i = 0;i < arr.length;i++){ int m = i; for(int j = i + 1;j < arr.length;j++){ //如果第j个元素比第m个元素小,将j赋值给m if(arr[j] < arr[m]){ m = j; } } //交换m和i两个元素的位置 if(i != m){ int t = arr[i]; arr[i] = arr[m]; arr[m] = t; } } return arr; }
冒泡排序:
public int[] bubbleSort(int[] arr){ for(int i = 0;i < arr.length;i++){ //比较两个相邻的元素 for(int j = 0;j < arr.length-i-1;j++){ if(arr[j] > arr[j+1]){ int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t; } } } return arr; }
#include<iostream> using namespace std; template<class T> void mySort(T arr[], int len) { for (int i = 0; i < len; i++) { for (int j = 0; j < len - i - 1; j++) { if (arr[i]> arr[j]) { T temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } template<class T> void Print(T arr[], int len) { for (int i = 0; i < len; i++) { cout << arr[i] << " " << endl; } } int main() { int arr[] = {1,32,12,5,98,5,656}; int len = sizeof(arr) / sizeof(char); mySort(arr, len); Print(arr, len); return 0; }
5.隐式转换
int add(int a, int b) { return a + b; } template<class T> T addt(T a, T b) { return a + b; } int main() { int a = 10; char b = 'a'; cout << add(a, b) << endl; cout << addt(a, b) << endl; cout << addt<int>(a, b) << endl; return 0; }
在这里的时候如果参数的类型不相同,普通函数不会报错,但是模板函数会报错,但是在加入了限制数据类型<int>之后就不会报错了
6.类模板语法
#include<iostream> #include<string> using namespace std; template<class Nametype,class Agetype> class Person { public: Person(Nametype name, Agetype age) { this->mname = name; this->mage = age; } void showperson() { cout << "mname:" << this->mname << "mname:" << this->mage << endl; } public: Nametype mname; Agetype mage; }; void showPerson() { Person<string, int> P("laozhichi", 19); P.showperson(); } int main() { showPerson(); return 0; }