版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
面向?qū)ο笤O(shè)計方法9.1泛型簡介9.2C++中的泛型9.3STL9.4JAVA中的泛型9.5C++和JAVA中泛型的比較9.6泛型的好處第九章泛型技術(shù)1.泛型泛型(Generic),是指具有在多種數(shù)據(jù)類型上皆可操作的含意。既編寫的代碼可以在不同的數(shù)據(jù)類型上重用。實現(xiàn)對源代碼進(jìn)行重用,既不是通過繼承和聚合重用對象代碼,也不是代碼的復(fù)制粘貼復(fù)用。泛型編程(GenericProgramming)
9.1泛型簡介9.2.1C++中泛型簡介在C++語言中稱泛型為模板(template),模板由函數(shù)模板和類模板兩部分組成,以所處理的數(shù)據(jù)類型的說明作為參數(shù)的函數(shù)叫做函數(shù)模板,而以所處理的數(shù)據(jù)類型的說明作為參數(shù)的類就叫類模板。9.2C++中的泛型1.示例:加法函數(shù)的重載intAdd(inta,intb){ returna+b;}longAdd(longa,longb){ returna+b;}根據(jù)不同的數(shù)據(jù)類型進(jìn)行多次重載,但是實現(xiàn)的代碼都是一致的。9.2.2函數(shù)模板2.函數(shù)模板的語法template<classType>TypeAdd(Typea,Typeb){ returna+b;}
具體使用為:Add(10,100);Add(10.1,23.4);9.2.2函數(shù)模板template:
關(guān)鍵字,總是放在模板的定義與聲明的最前面<>:模板參數(shù)列表,如果有多個模板參數(shù)用逗號隔開;模板參數(shù)分模板類型參數(shù)和模板非類型參數(shù)(代表一個常量表達(dá)式)。class:關(guān)鍵字,聲明模板類型參數(shù),用typename替代也可以。9.2.2函數(shù)模板template<classType>例如:template<classType,classTypeB>TypeAdd(Typea,TypeBb){ returna+b;}
注意此時a和b是兩種不同的變量類型9.2.2函數(shù)模板例如:template<classType,intsize>TypeAdd(Typea){ returna+size;}
注意此時a是模板類型參數(shù),而size是模板非類型參數(shù)。模板非類型參數(shù)是常整數(shù)(包括枚舉值)或者指向外部鏈接對象的指針,不能是浮點數(shù)和類對象。9.2.2函數(shù)模板例如:template<classType>TypeAdd(Typea,intsize){ returna+size;}
注意此時a是模板類型參數(shù),而size是函數(shù)參數(shù)9.2.2函數(shù)模板3.模板函數(shù)的實例化用系統(tǒng)實際的內(nèi)置或用戶定義類型將替換模板的類型參數(shù)。具體見源代碼示例。注意:不論是內(nèi)置類型還是用戶自定義類型必須要支持模板函數(shù)內(nèi)的操作。9.2.2函數(shù)模板1.示例:List鏈表的實現(xiàn)classListInt{public: voidAdd(intnValue); boolInsert(intnIndex,intnValue); intRemove(intnIndex);};只能滿足整型鏈表的要求,要根據(jù)不同的數(shù)據(jù)類型編寫多個鏈表類。9.2.3類模板2.類模板的定義template<classT>classList{public: voidAdd(TnValue); boolInsert(intnIndex,TnValue); TRemove(intnIndex);};9.2.3類模板3.類模板方法的實現(xiàn)方式template<classT>voidList<T>::Add(TnValue){…….}
9.2.3類模板4.類模板的實例化用系統(tǒng)實際的內(nèi)置或用戶定義類型將替換模板的類型參數(shù)。List<int>intList;List<double>douList;注意:不論是內(nèi)置類型還是用戶自定義類型必須要支持類模板內(nèi)的操作。
9.2.3類模板9.3.1STL簡介1.STL的含義
STL:StandardTemplateLibrary,標(biāo)準(zhǔn)模板庫,STL是泛型編程的實現(xiàn)品;STL就是一個數(shù)據(jù)結(jié)構(gòu)和算法框架。
STL的設(shè)計目標(biāo)就是將不同的算法和數(shù)據(jù)結(jié)構(gòu)結(jié)合起來,并獲得最佳效率。9.3STL2.STL與C++標(biāo)準(zhǔn)程序庫
STL于1994年被納入C++標(biāo)準(zhǔn)程序庫。STL雖然加入C++標(biāo)準(zhǔn)庫的時間相對較晚,但它卻是C++標(biāo)準(zhǔn)程序庫中最具革命性的部分,同時也是C++標(biāo)準(zhǔn)程序庫中最重要的組成部分。9.3.1STL簡介3.STL內(nèi)容
STL的代碼從廣義上講分為三類:container(容器)、algorithm(算法)和iterator(迭代器),幾乎所有的代碼都采用了模板類和模板函數(shù)的方式。9.3.1STL簡介容器對最常用的數(shù)據(jù)結(jié)構(gòu)提供了支持:vector,list,set,map,stack和queue。遺憾的是標(biāo)準(zhǔn)中沒有支持哈希表。9.3.1STL簡介算法STL提供了大約100個實現(xiàn)算法的模版函數(shù)。其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復(fù)制、修改、移除、反轉(zhuǎn)、排序、合并等等。9.3.1STL簡介迭代器
迭代器在STL中用來將算法和容器聯(lián)系起來,起著一種黏和劑的作用。幾乎STL提供的所有算法都是通過迭代器存取元素序列進(jìn)行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。9.3.1STL簡介1.命名空間(namespace)std當(dāng)你采用不同的模塊和程序庫時,經(jīng)常會出現(xiàn)名稱沖突現(xiàn)象,這是因為不同的模塊和程序庫可能針對不同的對象使用相同的標(biāo)識符.namespace可以解決該問題。
C++標(biāo)準(zhǔn)程序庫中所以的標(biāo)識符都統(tǒng)一到std這個命名空間。9.3.2幾個基本概念使用c++標(biāo)準(zhǔn)程序庫的標(biāo)識符有三種方法可供選擇:1>直接指定標(biāo)識符使用std::cout<<std::hex<<3.4<<std::endl;反是使用了C++標(biāo)準(zhǔn)程序庫的標(biāo)識符的地方均在關(guān)鍵字前增加“std::”。9.3.2幾個基本概念2>使用usingdeclaration,在文件頭處申明如下:usingstd::cout;usingstd::endl;cout<<std::hex<<3.4<<endl;只有在文件頭聲明了using語句的標(biāo)識符,在使用該標(biāo)識符,不需要添加“std::”。9.3.2幾個基本概念2>使用usingdeclaration,在文件頭處申明如下:usingstd::cout;usingstd::endl;cout<<std::hex<<3.4<<endl;只有在文件頭聲明了using語句的標(biāo)識符,在使用該標(biāo)識符,不需要添加“std::”。9.3.2幾個基本概念3>使用usingdirective,在文件頭處申明如下:usingnamespacestd;cout<<hex<<3.4<<endl;這種使用方式最簡單,所有在使用該標(biāo)識符,都不需要添加“std::”,但在大程序中可能會出現(xiàn)命名沖突。9.3.2幾個基本概念2.頭文件
C++標(biāo)準(zhǔn)程序庫中頭文件沒有擴(kuò)展名,使用如下:
#include<iostream>#include<string>為了向下兼容,你也可以使用舊式的C++頭文件:#include<stdlib.h>9.3.2幾個基本概念3.配置器(Allocators)配置器用于處理內(nèi)存配置和尋址,是一種特定的內(nèi)存模型。9.3.2幾個基本概念1.容器的分類9.3.3STL容器序列式容器每個元素均有固定的位置---取決于插入的時機(jī)和地點,和元素值無關(guān)。STL提供了vector、list和deque三個序列式容器。關(guān)聯(lián)式容器元素位置取決于特定的排序準(zhǔn)則和元素值,和插入次序無關(guān)。STL提供了四個關(guān)聯(lián)式容器:set、multiset、map和multimap。9.3.3STL容器2.
vectorVector將其元素置于一個動態(tài)數(shù)組中加以管理:它允許隨機(jī)存取,也就是說你可以利用索引直接存取任何一個元素。在數(shù)組尾部增加元素或移除元素均非常快速,但是在中部或頭部安插元素就比較費事。(見示例)9.3.3STL容器3.
dequedeque:double-endedqueue,雙端隊列。它也是一個動態(tài)數(shù)組,但是可以向兩端發(fā)展,因此無論先頭部還是尾部安插元素都是非常迅速。但如果在中間插入數(shù)據(jù)比較費事,因為要移動其他元素。(見示例)9.3.3STL容器4.
listlist,雙向鏈表,每個元素都有其前趨元素和后繼元素。List不提供隨機(jī)存取,但是其在任何位置插入或刪除元素速度快,效率高。(見示例)9.3.3STL容器5.
setset的內(nèi)部元素依據(jù)其值自動排序,每個元素值只能出現(xiàn)一次,不允許重復(fù)。6.Multiset
和set相同,只不過它允許重復(fù)元素。7.Mapmap的元素都是“實值/鍵值”所形成的一個對組,每個元素有一個鍵,是排序的基礎(chǔ)。8.Multimap
和map相同,只是允許重復(fù)鍵值。9.3.3STL容器1.
STL容器的共同能力
1>所有容器提供的都是“Value語意”而非“reference語意”。也就是說容器進(jìn)行元素安插操作時,內(nèi)部實施的是拷貝操作,置于容器內(nèi)。因此STL容器的每一個元素都必須能夠被拷貝。------拷貝構(gòu)造函數(shù)。
2>每個容器都有迭代器,利用迭代器就可以遍歷容器里的每個元素。
9.3.4容器的共同能力和操作
3>一般而言,各項操作并非絕對安全。調(diào)用者必須確保傳給操作函數(shù)的參數(shù)符合需求。違反這些需求(例如使用非法索引)會導(dǎo)致未定義的行為。
9.3.4容器的共同能力和操作2.
STL容器的共同操作初始化與大小相關(guān)的函數(shù)比較賦值9.3.4容器的共同能力和操作提供容器默認(rèn)初始化的構(gòu)造函數(shù)。通常每個容器都有幾個不同的構(gòu)造函數(shù),提供容器不同的初始化方法將容器初始化為現(xiàn)有同類容器副本的構(gòu)造函數(shù)撤消容器時,進(jìn)行內(nèi)存處理判容器是否為空,空返回true,不空返回false返回容器中最多允許的元素量返回容器當(dāng)前元素量默認(rèn)構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)析構(gòu)函數(shù)empty()max_size()size()說明標(biāo)準(zhǔn)庫容器共有的函數(shù)將一個容器賦值拷貝給另一個同類容器交換兩個容器的元素如果前面的容器小于后面的容器,則返回true,否則返回false,不適用于priority_queue如果前面的容器小于等于后面的容器,則返回true,否則返回false,不適用于priority_queue如果前面的容器大于后面的容器,則返回true,否則返回false,不適用于priority_queue如果前面的容器大于等于后面的容器,則返回true,否則返回false,不適用于priority_queue如果前面的容器等于后面的容器,則返回true,否則返回false,不適用于priority_queue如果前面的容器不等于后面的容器,則返回true,否則返回false,不適用于priority_queueoperator=swap()operator<operator<=operator>operator>=operator==operator!=說明標(biāo)準(zhǔn)庫容器共有的函數(shù)獲得指向被控序列開始處的迭代子,引用容器第一個元素獲得指向被控序列末端的迭代子,引用容器最后一個元素的后繼位置獲得指向被控序列末端的反轉(zhuǎn)型迭代子,引用容器最后一個元素。實際上這是該容器前后反轉(zhuǎn)之后的begin()獲得指向被控序列開始處的反轉(zhuǎn)型迭代子,引用容器第一個元素的前導(dǎo)位置。實際上這是該容器前后反轉(zhuǎn)之后的end()從容器中清除一個或幾個元素從容器中清除所有元素begin()end()rbegin()rend()erase()clear()說明只在第一類容器中的函數(shù)vector容器要求其元素必須有可賦值和可拷貝屬性。1.大小和容量2.操作函數(shù)3.作為普通數(shù)組使用4.異常處理5.實例分析(見源代碼)9.3.5Vector
迭代器是一個可以遍歷STL容器內(nèi)全部或部分元素的對象。支持*、++、==、!=、->、=操作符。見示例9.3.6迭代器STL提供了一些標(biāo)準(zhǔn)算法,包括搜尋、排序、拷貝、重新排序、修改、數(shù)值運算等十分基本而普遍的算法。算法并非容器類型的成員函數(shù),而是一種搭配迭代器使用的全局函數(shù)。見示例。
9.3.7算法
算法分類變化序列算法copy,remove,fill,replace,random_shuffle,swap,會改變?nèi)萜鞣亲兓蛄兴惴ǎ篴djacent-find,equal,mismatch,find,count,search,count_if,for_each,search_n以上函數(shù)模板都在<algorithm>中定義此外還有其他算法,比如<numeric>中的算法算法示例:find()template<classInIt,classT>InItfind(InItfirst,InItlast,constT&val);
first和last這兩個參數(shù)都是容器的迭代器,它們給出了容器中的查找區(qū)間起點和終點。這個區(qū)間是個左閉右開的區(qū)間,即區(qū)間的起點是位于查找范圍之中的,而終點不是算法示例:find()val參數(shù)是要查找的元素的值函數(shù)返回值是一個迭代器。如果找到,則該迭代器指向被找到的元素。如果找不到,則該迭代器指向查找區(qū)間終點。#include<vector>#include<algorithm>#include<iostream>usingnamespacestd;main(){ intarray[10]={10,20,30,40}; vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); vector<int>::iteratorp; p=find(v.begin(),v.end(),3); if(p!=v.end()) cout<<*p<<endl; p=find(v.begin(),v.end(),9); if(p==v.end()) cout<<"notfound"<<endl; p=find(v.begin()+1,v.end()-2,1); if(p!=v.end()) cout<<*p<<endl; int*pp=find(array,array+4,20); cout<<*pp<<endl;}輸出:3notfound320
幫助程序員防止“被異常拋出時發(fā)生資源泄露”。voidf(){ClassA*ptr=newClassA();try{...}catch(...){throw;}deleteptr;}
9.3.8智能指針有錯誤?正確為voidf(){ClassA*ptr=newClassA;try{...}catch(...){
deleteptr;throw;}deleteptr;}
9.3.8智能指針使用智能指針#include<memory>voidf(){std::auto_ptr<ClassA>ptr(newClassA);...}9.3.8智能指針智能指針的使用方法std::auto_ptr<ClassA>ptr1(newClassA);//OKstd::auto_ptr<ClassA>ptr2=newClassA;//ERROR9.3.8智能指針可以當(dāng)著是一種特殊的vector容器。9.3.9string(字符串)使用STL技術(shù)修改main()函數(shù)中的代碼,使之成為異常安全的ClassDerived{public:voidOnOpen(){//這里可能拋出異常}}9.3.10一道關(guān)于STL的面試題intmain(){Derived*pBase=NULL;pBase=newDerived();if(pBase!=NULL){pBase->OnOpen();deletepBase;}return0;}9.3.10一道關(guān)于STL的面試題解決方法std::auto_ptr<Derived>pBase(newDerived());pBase->OnOpen();
9.3.10一道關(guān)于STL的面試題STL僅僅是一個標(biāo)準(zhǔn),有很多公司實現(xiàn)了這個標(biāo)準(zhǔn),各具特點。
STLport是一個跨平臺可移植版本,應(yīng)用比較廣泛。
/
9.3.11STL選擇C++標(biāo)準(zhǔn)程序庫自修教程與參考手冊泛型編程與STLSTL源碼剖析EffectiveSTL(STL高效編程)C++設(shè)計新思維9.3.12C++泛型書籍推薦1.JDK1.4和JDK1.5部分函數(shù)比較類ArrayList
接口Comparable9.4JAVA中的泛型2.泛型方法和泛型類的聲明publicclassPair<T>
publicclassPair<T,U>{...}public<T>TgetMiddle(T[]a)9.4JAVA中的泛型3.類型變量的限定有時候類和方法需要類型變量進(jìn)行一定的限制。例如:9.4JAVA中的泛型classArrayAlg{publicstatic<T>Tmin(T[]a){if(a==null||a.length==0)returnnull;Tsmallest=a[0];for(inti=1;i<a.l
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來五年回油系列過濾器企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略分析研究報告
- 未來五年塑料面眼鏡盒企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略分析研究報告
- 未來五年彈簧行業(yè)直播電商戰(zhàn)略分析研究報告
- 未來五年老撾紅木企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略分析研究報告
- 未來五年食用豆行業(yè)跨境出海戰(zhàn)略分析研究報告
- 商業(yè)分析師面試題及商業(yè)智能BI含答案
- 法律顧問實務(wù)操作與面試常見問題解答
- 2026年版中國生活垃圾中轉(zhuǎn)站市場發(fā)展前景研究咨詢報告
- 初中英語代詞專項復(fù)習(xí)資料
- 醫(yī)藥代表市場推廣策略報告
- 2024-2025學(xué)年廣東省廣州市海珠區(qū)九年級(上)期末化學(xué)試題及答案
- 2025年山東省紀(jì)委遴選筆試試題及答案
- 建筑材料大一講解
- SMT物料基礎(chǔ)培訓(xùn)
- DB32∕T 3761.52-2022 新型冠狀病毒肺炎疫情防控技術(shù)規(guī)范 第52部分:方艙醫(yī)院
- AGV小車安全培訓(xùn)會課件
- 紡織業(yè)賬務(wù)知識培訓(xùn)課件
- 1688采購合同范本
- 購買鐵精粉居間合同范本
- GB/T 29730-2025冷熱水用分集水器
- 污水廠安全知識培訓(xùn)
評論
0/150
提交評論