C++模板-30-函數模板注意事項和數組排序練習

前面學習了函數模板,有了一個基本的瞭解。我們先來學習函數模板,後面還有一個類模板。先看看函數模板使用需要注意哪些事項,然後通過一個數組排序來練習函數模板。

 

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;
}

編譯,運行測試

上面寫了三個函數模板,分別是用來交換,打印輸出和排序。通過一個數組排序的例子,可以掌握函數模板的基本使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章