前面學習了函數模板,有了一個基本的瞭解。我們先來學習函數模板,後面還有一個類模板。先看看函數模板使用需要注意哪些事項,然後通過一個數組排序來練習函數模板。
1.函數模板注意事項
1)自動類型推導,必須推導出一致的數據類型T,纔可以使用
2)模板必須要確定T的數據類型,纔可以使用
例子
template <typename T>
返回類型 函數名稱(T a, T b)
第一點,編譯器會進行自動類型推導,但是上面這個T要類型一致纔可以,例如兩個參數都是int或者float類型,不可以int a, float b這樣的。
第二點,在函數體內部,這個T必須要利用起來,例如前面兩個數交換,我們函數體內部一行代碼 T temp = a; 這裏T就是在函數內部確定T的數據類型。如果定義要交換函數,裏面沒有用到T,實際上和普通函數一樣,這種情況下,會報錯。
上面關鍵字typename也可以用class代替。有些人習慣typename表示函數模板,用關鍵字class表示是一個類模板。其實,任何情況下都使用class都可以,看個人習慣。
2.數組排序練習
需求,給一個數組排序,採用快速排序算法,寫一個函數模板,支持任何數據類型的數組排序(大到小排序)。例如用一個int類型數組和一個char類型數組進行測試排序。
#include <iostream>
using namespace std;
//兩個交換位置的模板函數
template <class T>
void mySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
template <class T>
void myPrint(T arr[], int len)
{
for(int i = 0; i < len; i++)
{
cout << arr[i];
}
}
template <class T>
void mySort(T arr[], int len)
{
//quick sort
for(int i=0; i < len; i++)
{
int max = i; //假設數組中最大值的下標是i
for(int j = i+1; j < len; j++)
{
//兩兩比較
if(arr[max] < arr[j])
{
max = j;
}
}
if(max != i)
{
//交換位置
mySwap(arr[max], arr[i]);
}
}
}
void test01()
{
//int數組測試
int intArr[] = {1,7,2,6,3,9,4};
int len = sizeof(intArr) / sizeof(int);
mySort(intArr, len);
myPrint(intArr, len);
cout << endl;
//char數組測試
char chArr[] = "adfcgb";
int num = sizeof(chArr) / sizeof(char);
mySort(chArr, len);
myPrint(chArr, len);
}
int main()
{
test01();
system("pause");
return 0;
}
編譯,運行測試
上面寫了三個函數模板,分別是用來交換,打印輸出和排序。通過一個數組排序的例子,可以掌握函數模板的基本使用。