c++:利用模板類實現氣泡排序
首先我們來明確函式模板與類模板的概念及其用法。
模板是一種對型別進行引數化的工具,通常有兩種形式------>函式模板和類模板。
函式模板針對僅引數型別不同的函式;
類模板針對僅資料成員和成員函式型別不同的類。
函式模板的格式:
template <class 形參名,class 形參名,......> 返回型別 函式名(引數列表)
{
函式體
}
(1)template和class是關鍵字,class可以用typename關鍵字代替,在這裡typename 和class沒區別。
(2)<>括號中的引數叫模板形參
比如swap的模板函式形式為
template <class T>
void swap(T &a, T &b)
{
}
類模板的格式:
template<class 形參名,class 形參名,…> class 類名
{ ... };
類模板和函式模板都是以template開始後接模板形參列表組成,模板形參不能為空,一但聲明瞭類模板就可以用類模板的形參名宣告類中的成員變數和成員函式,即可以在類中使用內建型別的地方都可以使用模板形參名來宣告。比如
template<class T>
class A
{
public:
T hy(T c, T &d);
};
在類A中聲明瞭一個返回型別為T帶兩個引數型別為T的函式hy。
注意的是:
(1)模板函式沒有預設的型別轉換
(2)普通函式與函式模板一同存在,會優先呼叫普通函式
(3)模板的宣告或定義只能在全域性,名稱空間或類範圍內進行。即不能在區域性範圍,函式內進行,比如不能在main函式中宣告 或定義一個模板。
(4)在執行過程中,如果不加顯示呼叫,有時就會編譯出錯
舉例:
template < typename T > //函式模板
void print( T x , T y ) //模板函式沒有預設的型別轉換
{
cout<< "模板函式" <<endl;
cout<< x << " " << y <<endl;
}
void print(int x,int y) //普通函式有預設的型別轉換 且只有char型和int型可以自由轉換
{
cout<< "普通函式" <<endl;
cout<< x << " " << y <<endl;
}
在main函式中呼叫時出現如下程式碼
//普通函式與函式模板一同存在,會優先呼叫普通函式
print(1,2); //隱式呼叫
print<int>(1,2); //顯式呼叫
print(1,'a'); //只能呼叫普通函式實現 如果註釋掉普通函式,僅僅呼叫模板函式就會出錯
冒泡函式
//用氣泡排序 穩定演算法
#include<iostream>
using namespace std;
template <typename T>
void get(T *a,int len) //實現陣列內容輸入
{
for(int i=0;i<len;i++)
{
cin >> a[i];
}
}
template <typename T>
void Bubble_sort(T *a,int len) //進行排序
{
T tmp;
for(int i=1;i<=len-1;i++) //最後一個不需要比較
{
for(int j=0;j<=len-1-i;j++)
{
if(a[j]>a[j+1])
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}
template <typename T>
void print(T *a,int len) //實現陣列內容輸出
{
for(int i=0;i<len;i++)
{
cout<< a[i] << " ";
}
cout<<endl;
}
int main()
{
int len=10;
/*
int a[20]={0};
get<int>(a,len); //定義T為int型 輸出int型
Bubble_sort<int>(a,len); //顯示呼叫
print<int>(a,len);
*/
char a[20]="jquaisahsqwuqidshd";
Bubble_sort<char>(a, sizeof(a)/sizeof(a[0]) ); //定義T為char型 輸出char型
print<char>(a,sizeof(a)/sizeof(a[0]));
return 0;
}