C 函式模板和排序的函式模板 學習筆記

2021-04-29 20:05:42 字數 3084 閱讀 9957

我們在使用過載函式時,只是使用了函式名,而函式體還是得分別定義,在c++中函式模板為我們很好的解決了這個問題.

1.函式模板的宣告

函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。

函式模板的宣告形式為:

template

《返回型別》《函式名》(參數列)

其中,template是定義模板函式的關鍵字;template後面的尖括號不能省略;typename(或class)是宣告資料型別引數識別符號的關鍵字,用來說明它後面的識別符號是資料型別識別符號。這樣,在以後定義的這個函式中,凡希望根據實參資料型別來確定資料型別的變數,都可以用資料型別引數識別符號來說明,從而使這個變數可以適應不同的資料型別。例如:

template

t func(t x, int y)

函式模板只是宣告了乙個函式的描述即模板,不是乙個可以直接執行的函式,只有根據實際情況用實參的資料型別代替型別引數識別符號之後,才能產生真正的函式。

關鍵字typename也可以使用關鍵字class,這時資料型別引數識別符號就可以使用所有的c++資料型別。

2.模板函式的生成

函式模板的資料型別引數識別符號實際上是乙個型別形參,在使用函式模板時,要將這個形參例項化為確定的資料型別。將型別形參例項化的引數稱為模板實參,用模板實參例項化的函式稱為模板函式。模板函式的生成就是將函式模板的型別形參例項化的過程。

使用中應注意的幾個問題:

⑴ 函式模板允許使用多個型別引數,但在template定義部分的每個形參前必須有關鍵字typename或class,即:

template

《返回型別》《函式名》(參數列)

⑵ 在template語句與函式模板定義語句之間不允許有別的語句。如下面的宣告是錯誤的:

template

int i;

t min(t x,t y)

⑶ 模板函式類似於過載函式,但兩者有很大區別:函式過載時,每個函式體內可以執行不同的動作,但同乙個函式模板例項化後的模板函式都必須執行相同的動作 

3. 函式模板的異常處理

函式模板中的模板形參可例項化為各種型別,但當例項化模板形參的各模板實參之間不完全一致時,就可能發生錯誤,c++中,函式模板與同名的非模板函式過載時,應遵循下列呼叫原則:

• 尋找乙個引數完全匹配的函式,若找到就呼叫它。若引數完全匹配的函式多於乙個,則這個呼叫是乙個錯誤的呼叫。

• 尋找乙個函式模板,若找到就將其實例化生成乙個匹配的模板函式並呼叫它。

• 若上面兩條都失敗,則使用函式過載的方法,通過型別轉換產生引數匹配,若找到就呼叫它。

•若上面三條都失敗,還沒有找都匹配的函式,則這個呼叫是乙個錯誤的呼叫。

在前期做了乙份sort(),qsort()的用法分析,鏈結如下:

但是qsort()需要自己編寫乙個比較器函式,同時不支援c++集合類,那麼就可以自己編寫乙個模板函式來實現.

4.排序函式模板的實現

該函式模板使用冒泡法對集合元素進行排序,引數說明:

collection        集合物件,集合物件必須提供 操作。

element          集合元素,該引數的作用僅僅是確定集合元素型別,引數的值沒有用,建議取集合的第乙個元素。集合元素必須提供複製、賦值和比較操作。

count            集合元素的數目

ascend          表明排序時使用公升序(true)還是降序(false)

該函式模板支援c++陣列以及mfc集合cstringarray、carray。

**如下:

template 

void   bubblesort(collection_type collection,element_type element,int count,bool ascend=true)  

}else}}

k=element_flag;

}}  

利用它對整型陣列進行排序,

int arrayint=;

bubblesort(arrayint,0,10,false);//如果省去false講按預設的true排列

對整數集合按公升序排序: 

carray collectionint;

collectionint.add(34);

collectionint.add(90);

collectionint.add(6);

collectionint.add(91);

collectionint.add(37);

collectionint.add(21);

collectionint.add(187);

bubblesort(collectionint, collectionint[0],

collectionint.getsize());

對字串陣列的排列:

string arraystring[4] = ;

bubblesort(arraystring,0,4,false);

對乙個字串集合按降序排序:

cstringarray collectionstring;

collectionstring.add("jackjones");

collectionstring.add("lee");

collectionstring.add("levi's");

collectionstring.add("boss");

bubblesort(collectionstring, collectionstring[0],

collectionstring.getsize(), false);

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...