C++09第9章_模板課件_第1頁
C++09第9章_模板課件_第2頁
C++09第9章_模板課件_第3頁
C++09第9章_模板課件_第4頁
C++09第9章_模板課件_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第第9章章 模板模板9.1 模板的概念模板的概念9.2 函數(shù)模板函數(shù)模板9.3 類模板類模板9.4 標(biāo)準(zhǔn)模板庫標(biāo)準(zhǔn)模板庫STL9.5 應(yīng)用實(shí)例應(yīng)用實(shí)例1 模板的概念模板的概念1.1 類型的嚴(yán)格性與靈活性類型的嚴(yán)格性與靈活性1.2 解決沖突的途徑解決沖突的途徑1.3 模板的概念模板的概念1.1 類型的嚴(yán)格性與靈活性類型的嚴(yán)格性與靈活性 在強(qiáng)類型程序設(shè)計語言中,參與運(yùn)算的所在強(qiáng)類型程序設(shè)計語言中,參與運(yùn)算的所有對象的類型在編譯時即可確定下來,并且編有對象的類型在編譯時即可確定下來,并且編譯程序?qū)⑦M(jìn)行嚴(yán)格的類型檢查。譯程序?qū)⑦M(jìn)行嚴(yán)格的類型檢查。 強(qiáng)類型語言提高了程序的可靠性,但也帶強(qiáng)類型語言提高了程

2、序的可靠性,但也帶來了一些負(fù)作用,例如來了一些負(fù)作用,例如: :1.1 類型的嚴(yán)格性與靈活性類型的嚴(yán)格性與靈活性以下兩個函數(shù)以下兩個函數(shù)int max(int a,int b)return ab? a:b;和和 float max(float a,float b)return ab? a:b; 強(qiáng)類型的程序設(shè)計迫使程序員為邏輯結(jié)強(qiáng)類型的程序設(shè)計迫使程序員為邏輯結(jié)構(gòu)相同而具體數(shù)據(jù)類型不同的對象編寫模構(gòu)相同而具體數(shù)據(jù)類型不同的對象編寫模式式致的代碼,而無法抽取其中的共性,不致的代碼,而無法抽取其中的共性,不利于程序的擴(kuò)充和維護(hù)。利于程序的擴(kuò)充和維護(hù)。1.1 類型的嚴(yán)格性與靈活性類型的嚴(yán)格性與靈活性

3、1.2 解決沖突的途徑解決沖突的途徑 解決類型的嚴(yán)格性與靈活性沖突,解決類型的嚴(yán)格性與靈活性沖突,以前有以前有3 3種方法:種方法:用宏函數(shù)用宏函數(shù)為各種類型都重載這一函數(shù)為各種類型都重載這一函數(shù)放松類型檢查放松類型檢查最理想的方法是:最理想的方法是: 直接將數(shù)據(jù)類型作為類的參數(shù),就好像函直接將數(shù)據(jù)類型作為類的參數(shù),就好像函數(shù)可以將數(shù)據(jù)作為參數(shù)一樣,這種機(jī)制稱為類數(shù)可以將數(shù)據(jù)作為參數(shù)一樣,這種機(jī)制稱為類屬。屬。1.2 解決沖突的途徑解決沖突的途徑1.3 模板的概念模板的概念 模板是一種參數(shù)化多態(tài)性的工具,可以為模板是一種參數(shù)化多態(tài)性的工具,可以為邏輯功能相同而類型不同的程序提供一種代碼邏輯功能

4、相同而類型不同的程序提供一種代碼共享的機(jī)制。共享的機(jī)制。 在在C+C+中,模板分為函數(shù)模板和類模板。中,模板分為函數(shù)模板和類模板。 一個模板并非一個實(shí)實(shí)在在的函數(shù)或類,一個模板并非一個實(shí)實(shí)在在的函數(shù)或類,僅僅是一個函數(shù)或類的描述,這些模板運(yùn)算對僅僅是一個函數(shù)或類的描述,這些模板運(yùn)算對象的類型不是實(shí)際的數(shù)據(jù)類型,而是一種參數(shù)象的類型不是實(shí)際的數(shù)據(jù)類型,而是一種參數(shù)化的類型化的類型( (又稱為類屬類型又稱為類屬類型) )。1.3 模板的概念模板的概念 模板的類屬參數(shù)由調(diào)用它的實(shí)際參數(shù)的具模板的類屬參數(shù)由調(diào)用它的實(shí)際參數(shù)的具體數(shù)據(jù)類型替換,由編譯器生成一段真正可以體數(shù)據(jù)類型替換,由編譯器生成一段真正

5、可以運(yùn)行的代碼。這個過程稱為實(shí)例化。運(yùn)行的代碼。這個過程稱為實(shí)例化。 通過參數(shù)實(shí)例化可以再構(gòu)造出具體的函數(shù)通過參數(shù)實(shí)例化可以再構(gòu)造出具體的函數(shù)或類,稱為模板函數(shù)和模板類,它們之間的關(guān)或類,稱為模板函數(shù)和模板類,它們之間的關(guān)系如下圖所示。系如下圖所示。1.3 模板的概念模板的概念 實(shí)例化 實(shí)例化 模板 (函數(shù)模板或類模板) 模板函數(shù) 模板類 對 象 實(shí)例化 9.2 函數(shù)模板函數(shù)模板2.1 函數(shù)模板的定義函數(shù)模板的定義2.2 函數(shù)模板的實(shí)例化函數(shù)模板的實(shí)例化2.3 函數(shù)模板的重載函數(shù)模板的重載2.1 函數(shù)模板的定義函數(shù)模板的定義函數(shù)模板的定義格式如下:函數(shù)模板的定義格式如下:template ()

6、 其中其中:2.1 函數(shù)模板的定義函數(shù)模板的定義關(guān)鍵字關(guān)鍵字template是定義一個模板的關(guān)鍵字是定義一個模板的關(guān)鍵字中包含一個或多個用逗號分開的中包含一個或多個用逗號分開的模板參數(shù)項,每一項由保留字模板參數(shù)項,每一項由保留字class或或typename開始,后跟一個用戶命名的標(biāo)識符,此標(biāo)識符為開始,后跟一個用戶命名的標(biāo)識符,此標(biāo)識符為模板參數(shù),表示一種數(shù)據(jù)類型,函數(shù)模板中可以模板參數(shù),表示一種數(shù)據(jù)類型,函數(shù)模板中可以利用這些模板參數(shù)定義函數(shù)返回值類型、參數(shù)類利用這些模板參數(shù)定義函數(shù)返回值類型、參數(shù)類型和函數(shù)體中的變量類型。它同基本數(shù)據(jù)類型一型和函數(shù)體中的變量類型。它同基本數(shù)據(jù)類型一樣,可

7、以在函數(shù)中的任何地方使用。樣,可以在函數(shù)中的任何地方使用?!纠纠?.1】定義函數(shù)模板求兩個數(shù)中的較大值。】定義函數(shù)模板求兩個數(shù)中的較大值。template T max(T a, T b)return ab? a:b;當(dāng)程序中使用這個函數(shù)模板時,編譯程序?qū)⒏鶕?jù)函數(shù)調(diào)當(dāng)程序中使用這個函數(shù)模板時,編譯程序?qū)⒏鶕?jù)函數(shù)調(diào)用時的實(shí)際數(shù)據(jù)類型產(chǎn)生相應(yīng)的函數(shù)。如產(chǎn)生求兩個整用時的實(shí)際數(shù)據(jù)類型產(chǎn)生相應(yīng)的函數(shù)。如產(chǎn)生求兩個整數(shù)中的較大值的函數(shù),或求兩個浮點(diǎn)數(shù)中的較大值函數(shù)數(shù)中的較大值的函數(shù),或求兩個浮點(diǎn)數(shù)中的較大值函數(shù)等等。等等。2.1 函數(shù)模板的定義函數(shù)模板的定義 中可以使用模板參數(shù),也可以使用一般中可以使用

8、模板參數(shù),也可以使用一般類型參數(shù)。但類型參數(shù)。但至少有一個形參的類型必須用至少有一個形參的類型必須用中的形參來定義,并且在中的形參來定義,并且在中的每個模板參數(shù)都必須在中的每個模板參數(shù)都必須在中得到使用,即中得到使用,即作為形參的類型使用。作為形參的類型使用。例如:例如:template T1 func(T2) 是錯誤的聲明,盡管是錯誤的聲明,盡管func()的返回值用到了模板參數(shù)的返回值用到了模板參數(shù)表中的表中的T1,但函數(shù)參數(shù)表中沒有用到模板參數(shù),但函數(shù)參數(shù)表中沒有用到模板參數(shù)T1。兩個變元都被顯式傳給運(yùn)算符函數(shù)。兩個變元都被顯式傳給運(yùn)算符函數(shù)。 2.1 函數(shù)模板的定義函數(shù)模板的定義2.2

9、 函數(shù)模板的實(shí)例化函數(shù)模板的實(shí)例化 函數(shù)模板是對一組函數(shù)的描述,它以類型函數(shù)模板是對一組函數(shù)的描述,它以類型作為參數(shù)及函數(shù)返回值類型。它不是一個實(shí)實(shí)作為參數(shù)及函數(shù)返回值類型。它不是一個實(shí)實(shí)在在的函數(shù),編譯時并不產(chǎn)生任何執(zhí)行代碼。在在的函數(shù),編譯時并不產(chǎn)生任何執(zhí)行代碼。當(dāng)編譯系統(tǒng)在程序中發(fā)現(xiàn)有與函數(shù)模板中相匹當(dāng)編譯系統(tǒng)在程序中發(fā)現(xiàn)有與函數(shù)模板中相匹配的函數(shù)調(diào)用時,便生成一個重載函數(shù)。該重配的函數(shù)調(diào)用時,便生成一個重載函數(shù)。該重載函數(shù)的函數(shù)體與函數(shù)模板的函數(shù)體相同,參載函數(shù)的函數(shù)體與函數(shù)模板的函數(shù)體相同,參數(shù)為具體的數(shù)據(jù)類型。我們稱該重載函數(shù)為模數(shù)為具體的數(shù)據(jù)類型。我們稱該重載函數(shù)為模板函數(shù),它是

10、函數(shù)模板的一個具體實(shí)例。板函數(shù),它是函數(shù)模板的一個具體實(shí)例。9.2.2 函數(shù)模板的實(shí)例化函數(shù)模板的實(shí)例化函數(shù)模板和模板函數(shù)的關(guān)系函數(shù)模板和模板函數(shù)的關(guān)系 函數(shù)模板 template T max(T a, T b) 模板函數(shù) int max(int, int) 模板函數(shù) char max(char, char) 模板函數(shù) float max(float, float) 模板函數(shù) string max(string, string) 實(shí)例化 實(shí)例化 實(shí)例化 實(shí)例化 9.2.3 函數(shù)模板的重載函數(shù)模板的重載 函數(shù)模板可以用多種方式重載,可以定義同名的函函數(shù)模板可以用多種方式重載,可以定義同名的函數(shù)模

11、板,提供不同的參數(shù)和實(shí)現(xiàn);也可以用其它非模數(shù)模板,提供不同的參數(shù)和實(shí)現(xiàn);也可以用其它非模板函數(shù)重載。板函數(shù)重載。9.3 類模板類模板9.3.1 類模板定義類模板定義9.3.2 類模板的實(shí)例化類模板的實(shí)例化9.3.3 使用函數(shù)類型參數(shù)的類模板使用函數(shù)類型參數(shù)的類模板9.3.4 使用默認(rèn)參數(shù)的類模板使用默認(rèn)參數(shù)的類模板 同函數(shù)模板一樣,使用類模板可以為類定同函數(shù)模板一樣,使用類模板可以為類定義一種模式,使得類中的某些數(shù)據(jù)成員、某些義一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能取成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能取任意類型。類模板是對一批僅有成員數(shù)據(jù)類型任意類型。

12、類模板是對一批僅有成員數(shù)據(jù)類型不同的類的抽象。不同的類的抽象。3.1 類模板定義類模板定義類模板的定義格式:類模板的定義格式:template class 其中,其中,中包含一個或多個用逗號中包含一個或多個用逗號分開的類型,參數(shù)項可以包含基本數(shù)據(jù)類型,分開的類型,參數(shù)項可以包含基本數(shù)據(jù)類型,也可以包含類類型:如果是類類型,則須加前也可以包含類類型:如果是類類型,則須加前綴綴class或或typename。3.1 類模板定義類模板定義 類模板中的成員函數(shù)和重載的運(yùn)算符必須為函數(shù)類模板中的成員函數(shù)和重載的運(yùn)算符必須為函數(shù)模板。放在類模板的外部,采用以下形式:模板。放在類模板的外部,采用以下形式:t

13、emplate :() 其中,其中,即是類模板中定義的名稱,即是類模板中定義的名稱,即是類模板定義中的類型形式參數(shù)表中的參數(shù)名。即是類模板定義中的類型形式參數(shù)表中的參數(shù)名。3.1 類模板定義類模板定義 類模板的實(shí)例化是指用某一數(shù)據(jù)類型替代類類模板的實(shí)例化是指用某一數(shù)據(jù)類型替代類模板的類型參數(shù),格式為:模板的類型參數(shù),格式為: 由類模板經(jīng)實(shí)例化而生成的具體類稱之為模由類模板經(jīng)實(shí)例化而生成的具體類稱之為模板類。格式為:板類。格式為: ( )3.2 類模板的實(shí)例化類模板的實(shí)例化類模板實(shí)例化以及類實(shí)例化的邏輯關(guān)系類模板實(shí)例化以及類實(shí)例化的邏輯關(guān)系3.2 類模板的實(shí)例化類模板的實(shí)例化 類模板 atype

14、(AType) 模板類 atype 模板類 atype intob 對象 doubleob 對象 實(shí)例化 實(shí)例化 實(shí)例化 實(shí)例化 在類模板的在類模板的中,必須至少有一個中,必須至少有一個類參數(shù),當(dāng)然可以有多個類參數(shù)。還可以有非類參類參數(shù),當(dāng)然可以有多個類參數(shù)。還可以有非類參數(shù)的參數(shù),一般稱之為函數(shù)類型參數(shù),也稱之為無數(shù)的參數(shù),一般稱之為函數(shù)類型參數(shù),也稱之為無類型模板參數(shù)。類型模板參數(shù)。 函數(shù)類型參數(shù)只限于整型、指針型和引用,其函數(shù)類型參數(shù)只限于整型、指針型和引用,其它類型它類型(例如浮點(diǎn)型例如浮點(diǎn)型float)不能使用。不能使用。3.3 使用函數(shù)類型參數(shù)的類模板使用函數(shù)類型參數(shù)的類模板 類模

15、板可以包含與通用類型相關(guān)的默認(rèn)參類模板可以包含與通用類型相關(guān)的默認(rèn)參數(shù)。當(dāng)類模板被實(shí)例化時,如果沒有指定其它數(shù)。當(dāng)類模板被實(shí)例化時,如果沒有指定其它的數(shù)據(jù)類型,則使用默認(rèn)類型。的數(shù)據(jù)類型,則使用默認(rèn)類型。 函數(shù)類型參數(shù)也可以使用默認(rèn)參數(shù),當(dāng)類函數(shù)類型參數(shù)也可以使用默認(rèn)參數(shù),當(dāng)類模板被實(shí)例化時,如果沒有顯式地指定它的值,模板被實(shí)例化時,如果沒有顯式地指定它的值,則使用默認(rèn)值。則使用默認(rèn)值。3.4 使用默認(rèn)參數(shù)的類模板使用默認(rèn)參數(shù)的類模板9.4 標(biāo)準(zhǔn)模板庫標(biāo)準(zhǔn)模板庫STL9.4.1 容器容器9.4.2 迭代器迭代器9.4.3 算法算法4.1 容器容器 C+包含一個有許多組件的標(biāo)準(zhǔn)庫。標(biāo)準(zhǔn)模包含一個

16、有許多組件的標(biāo)準(zhǔn)庫。標(biāo)準(zhǔn)模板庫板庫(Standard Template Library,STL)是標(biāo)準(zhǔn)是標(biāo)準(zhǔn)C+庫的一部分。庫的一部分。標(biāo)準(zhǔn)模板庫中有標(biāo)準(zhǔn)模板庫中有3個主要組件:個主要組件:容器容器(container)迭代器迭代器(iterator)算法算法(algorithm)4.1 容器容器“容器容器”是數(shù)據(jù)結(jié)構(gòu),是包含對象的對象。是數(shù)據(jù)結(jié)構(gòu),是包含對象的對象。1.容器的分類容器的分類STL容器類庫中包含容器類庫中包含7種基本容器:種基本容器:vector(向量向量)、deque(雙向隊列雙向隊列)、list(雙向鏈表雙向鏈表)、set(集集合合)、multiset(多重集合多重集合)、

17、map(映像映像)、multimap(多重映多重映像像)?;救萜骺梢苑殖蓛山M:順序容器和關(guān)聯(lián)容器基本容器可以分成兩組:順序容器和關(guān)聯(lián)容器 4.1 容器容器2.容器的接口容器的接口4.1 容器容器3.順序容器順序容器 順序容器將一組具有相同類型的元素以嚴(yán)格的線性順序容器將一組具有相同類型的元素以嚴(yán)格的線性形式組織起來。分為形式組織起來。分為vector、deque和和1ist 3種類型。種類型。 3種順序容器在某些方面是相似的。如,都有用于種順序容器在某些方面是相似的。如,都有用于增加元素的增加元素的insert成員函數(shù),及用于刪除元素的成員函數(shù),及用于刪除元素的erase成成員函數(shù)等,員函數(shù)

18、等,3種順序容器的元素均可通過位置來訪問。種順序容器的元素均可通過位置來訪問。 4.1 容器容器3種容器具有各自不同的特點(diǎn)。例如,種容器具有各自不同的特點(diǎn)。例如,vector和和deque都重載了操作符都重載了操作符 ,而,而1ist則沒有,所以則沒有,所以1ist容器不支持隨機(jī)訪問,除容器不支持隨機(jī)訪問,除operator 和和at()函數(shù)外,函數(shù)外,1ist提供提供vector的其余功能。另外,的其余功能。另外,1ist容器還提供成員容器還提供成員函數(shù)函數(shù)splice()和和merge()合并列表,合并列表,sort()排列列表,排列列表,push_front()和和pop_front()

19、追加和刪除列表元素。追加和刪除列表元素。deque容器就像容器就像vector和和1ist的混合體,既支持的混合體,既支持vector的行為,又支持的行為,又支持1ist的行為。的行為。另一個重要區(qū)別是它們在時間和存儲效率上不相同。另一個重要區(qū)別是它們在時間和存儲效率上不相同。4.1 容器容器4.關(guān)聯(lián)容器關(guān)聯(lián)容器 關(guān)聯(lián)容器具有根據(jù)一組索引來快速提取元素能力,關(guān)聯(lián)容器具有根據(jù)一組索引來快速提取元素能力,其中元素可以通過鍵值(其中元素可以通過鍵值(key)來訪問。)來訪問。4種關(guān)聯(lián)容器可種關(guān)聯(lián)容器可以分成兩組:以分成兩組:set和和map。set是一種集合,其中可包含是一種集合,其中可包含0個或多

20、個不重復(fù)的和不個或多個不重復(fù)的和不排序的元素,這些元素被稱為鍵值。排序的元素,這些元素被稱為鍵值。例如,例如,set集合集合s 4,-99,50包含包含3個鍵值。與例個鍵值。與例7.9中的中的nums不同,不能通過下標(biāo)不同,不能通過下標(biāo)來訪問集合來訪問集合s。4.1 容器容器 map是一種映像,其中可包含是一種映像,其中可包含0個或多個不排序的個或多個不排序的元素對,一個元素是不重復(fù)的鍵值,另一個是與鍵相關(guān)元素對,一個元素是不重復(fù)的鍵值,另一個是與鍵相關(guān)聯(lián)的值。例如,聯(lián)的值。例如,map集合集合m (first,4),(second,-99),(third,50) 包含包含3對元素。每對元素由

21、一個鍵值和相關(guān)聯(lián)的值對元素。每對元素由一個鍵值和相關(guān)聯(lián)的值構(gòu)成。構(gòu)成。4.1 容器容器 multiset是容許有重復(fù)鍵值的是容許有重復(fù)鍵值的set,而,而multimap是是容許有重復(fù)鍵值的容許有重復(fù)鍵值的map。 map和和multimap容器的元素按關(guān)鍵字順序排列,容器的元素按關(guān)鍵字順序排列,因此提供按關(guān)鍵字的快速查找。重載算符函數(shù)因此提供按關(guān)鍵字的快速查找。重載算符函數(shù)operator基于關(guān)鍵字的查找和插入。成員函數(shù)基于關(guān)鍵字的查找和插入。成員函數(shù)find(),count(),lower_bound()和和upper_bound()基于元素鍵值的查找基于元素鍵值的查找和計數(shù)。和計數(shù)。 set,multiset與與map,multimap很相似。區(qū)別僅很相似。區(qū)別僅是是set和和multiset不支持下標(biāo)操作。不支持下標(biāo)操作。4.1 容器容器4.2 迭代器迭代器 簡單地說,迭代器是面向?qū)ο蟀姹镜闹羔?,簡單地說,迭代器是面向?qū)ο蟀姹镜闹羔?,STL算算法利用迭代器對存儲在容器中的元素序列進(jìn)行遍歷,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論