模板庫(kù)使用NEU-APNIA事業(yè)部培訓(xùn)模版簡(jiǎn)介_(kāi)第1頁(yè)
模板庫(kù)使用NEU-APNIA事業(yè)部培訓(xùn)模版簡(jiǎn)介_(kāi)第2頁(yè)
模板庫(kù)使用NEU-APNIA事業(yè)部培訓(xùn)模版簡(jiǎn)介_(kāi)第3頁(yè)
模板庫(kù)使用NEU-APNIA事業(yè)部培訓(xùn)模版簡(jiǎn)介_(kāi)第4頁(yè)
模板庫(kù)使用NEU-APNIA事業(yè)部培訓(xùn)模版簡(jiǎn)介_(kāi)第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

一、模板簡(jiǎn)單介紹 二、STL概 三、STL的組件以及關(guān) 四、常用容器介 五、寫(xiě)在后 六、附錄:如何選擇容 一、模板簡(jiǎn)單介紹函數(shù)模要求:此函數(shù)可以接受int、char以及double類(lèi)型的參數(shù)。charcharMaxOfChar(charcNum1,charcNum2{return(cNum1>cNum2)?cNum1:}//用于比較intintMaxOfInt(intiNum1,intiNum2{return(iNum1>iNum2)?iNum1:}doubleMaxOfDouble(doubledNum1,doubledNum2{return(dNum1>dNum2)?dNum1:}charcharMax(charcNum1,charcNum2{return(cNum1>cNum2)?cNum1:}//用于比較intintMax(intiNum1,intiNum2{return(iNum1>iNum2)?iNum1:}doubleMax(doubledNum1,doubledNum2{return(dNum1>dNum2)?dNum1:}C++的實(shí)現(xiàn)方式,完全沒(méi)有必要去記住哪個(gè)函數(shù)對(duì)應(yīng)哪種數(shù)據(jù)類(lèi)型,因?yàn)椴还苁轻槍?duì)哪種數(shù)據(jù)類(lèi)型的比較,只需要簡(jiǎn)單的調(diào)用Max()就可temte<classTTMax(constT&Input1,constT&Input2{return(Input1>Input2)?Input1:}甚至任何自定義類(lèi)型(只要你實(shí)現(xiàn)了它的比較運(yùn)算符operator>)。#defineMax(Input1,Input2)((Input1>Input2)?Input1:Input2temte<classT>————〉TMax(constT&Input1,constT&Input2{return(Input1>Input2)?Input1:}1Inputconst&的,這樣做的好處是減少函數(shù)調(diào)用時(shí)候的開(kāi)銷(xiāo),因?yàn)槲覀儾恢繲類(lèi)型到底有多大。類(lèi)模#define#define0#definetemte<classT>classCVector{CVector():{}unsignedint{return}intpush_back(constT&Element{if(m_Size>MAX_NUM-1{return}DataList[m_Size]=Element;return}intpop_back(T&Element{if(0==m_Size{return}}

Element=DataList[m_Size-1];m_Size--;returnunsignedintTDataList[MAX_NUMTypeList.push_back(Element);TypeList.pop_back(Element);

CVector<TypeName>需要考慮到各種性能和空間的因素,行為也很復(fù)雜。不過(guò)STL設(shè)計(jì)的思想正是基于模板。二、STL先進(jìn)技術(shù)與深厚理論的產(chǎn)品。說(shuō)他是產(chǎn)品也可以,說(shuō)他是規(guī)格也可以,說(shuō)是軟件組件技術(shù)發(fā)展史上一個(gè)讓工程師/程序員的心血不至于隨時(shí)間的推移、人事異動(dòng)而煙消云散。從副程式(subroutines)、程序(procedures、函數(shù)(functions)、類(lèi)別(classes),到函數(shù)庫(kù)(functionlibraries、類(lèi)別庫(kù)(classlibraries)、各種組件(components),從結(jié)構(gòu)化設(shè)計(jì)、模組化設(shè)計(jì)、物件導(dǎo)向設(shè)計(jì),到樣式(patterns)STL就是在這個(gè)背景下誕生的。STL的價(jià)值在兩方面。低層次而言,STL帶給我們一套急具價(jià)值的零組件,這種價(jià)值就像MFC對(duì)于Windows開(kāi)發(fā)過(guò)程所帶來(lái)的價(jià)值一樣,直接而。除此之外STL還帶給我們一個(gè)次的以泛型思維為基礎(chǔ)的設(shè)計(jì)理念。在這個(gè)里面,我們只會(huì)提到如何使用STL,對(duì)于次的三、 的組件以及關(guān) STL六大組件的關(guān)系如下圖所示:Container通過(guò)Allocator取得數(shù)據(jù)空間,Algorithm通過(guò)Itor存Container內(nèi)容,F(xiàn)unctor可以協(xié)助Algorithm完成不同的策略變化,Adapter可以修飾或者套接Funtor。四、常用容器介序列式容序列式容器包括:Vector、List、Queue、Stack等。Vector基本結(jié)Vectr是說(shuō)你完全可以不必關(guān)心你到底向這個(gè)數(shù)組里面添加了多少個(gè)元素,繼續(xù)添加就對(duì)了(當(dāng)然內(nèi)存耗盡。實(shí)際上,Vector的實(shí)現(xiàn)就像文章開(kāi)頭所舉的例子一樣,在初始化的時(shí)候,會(huì)申請(qǐng)一定的空間用來(lái)數(shù)vector<int>iv(1)00110iv.size()==iv.capacity()==012iv.size()==3;iv.capacity()==4;可以觀察到,VectorPush操Vector的一個(gè)策略,前面提到過(guò),Vector的空間是連續(xù)的,而連續(xù)空間的申請(qǐng)和釋放操作都相當(dāng)耗Vector的常用成員函構(gòu)造函數(shù)Example:vector<int>vector(SizeTypecountExample:vector<int>iv(3);vector(SizeTypecount,ConstType&ValExample:vector<int>iv(3,2);vector(const_vector&SourceVectorExample:vector<int>vector<int>iv2(iv1其他成員函referenceat(size_typePosExample:vector<int>iv.push_back(1iv.push_back(2iv.push_back(3referenceExample:vector<int>iv;iv.push_back(1iv.push_back(2iv.push_back(3 tor說(shuō)明:返回Vector初始位置的迭代器(i Example:vector<int>iv;iv.push_back(1iv.push_back(2iv.push_back(3 torItiv.begin();inti=*It;//i的值應(yīng)該是1,2Vector來(lái)講,它的迭代器在使用的時(shí)候完全可以等同于一般的指針。Example:vector<int>iv.push_back(1iv.push_back(2iv.push_back(3voidExample:vector<int>iv.push_back(iv.push_back(1iv.push_back(2intiSizeiv.size()iSizeboolExample:vector<int>iv.push_back(1); torExample:vector<int>iv;iv.push_back(1iv.push_back(2//循環(huán)整個(gè)for( torit=iv.begin();it!=iv.end();++it{Do} torerase( torWhere torerase( torFirst, torLast-”Example:vector<int>iv.push_back(1iv.push_back(2iv.push_back(3iv.eraseiv.begin1刪除元素iv.eraseiv.beginiv.begin2刪除元素“1”和erase的參數(shù)Where和First、Last必須在[begin(),end()]范圍之內(nèi),否則會(huì)發(fā)生的錯(cuò)Example:vector<int>iv;iv.push_back(1iv.push_back(2iv.push_back(iv.push_back(3inti=iv.fronti torinsert(i torWhereconstType&Val)Example:vector<int>iv.push_back(1insert的位置必須在[begin(),end()]范圍之內(nèi),否則會(huì)發(fā)生的錯(cuò)誤voidpush_back(constType&ValvoidExample:vector<int>iv.push_back(1iv.push_back(2iv.pop_back();//此時(shí)元素為1,2size_typesize()referenceoperator[](size_typePos)Example:vector<int>iv;iv.push_back(1iv.push_back(2iv.push_back(3//iv[0]=1,iv[1]=2,iv[2]=1、operator[]只能用來(lái)取得已經(jīng)存在的元素,而不能向vector中添加元素,例如下面的代碼是錯(cuò)誤vector<int>iv01;//錯(cuò)誤,vector的空間還沒(méi)有被分2、operator[]和正常數(shù)組的使用方法一樣,也同樣沒(méi)有越界檢查,比如你通過(guò)iv[10]的方式一個(gè)只有1個(gè)元素的vector,不會(huì)被提示出錯(cuò),但這樣做可能會(huì)有不可預(yù)計(jì)的事情發(fā)生。Vector綜合示例#include<stdlib.h>#include<time.h>#include<vector>classCDataSet{staticenum{ALLDATA= t:隨機(jī)數(shù)的個(gè)數(shù)iMaxData:CDataSet(unsigned t,unsignedintiMaxData t{srand((unsigned)time(NULL)for(intiLoop=0;iLoop t;++iLoop{m_DataList.push_back((unsignedint)rand()%iMaxData}}int{ t=vector<int torfor(it=m_DataList.begin();it!=m_DataList.end();++it{if(m_bIsPrimeData(*it){}} }voidPrint(ePrintRangeiPrintRange){switch(iPrintRange{case{}case{}{}}}//boolIsPrimeData(unsignedintiDataIndex{if(iDataIndex t{return}returnm_bIsPrimeData(m_DataList[iDataIndex]}//boolm_bIsPrimeData(intiInputData){for(intiLoop=2;iLoop<iInputData;++iLoop{if(0==iInputData%iLoop{}}return((iLoop==iInputData)&&(iLoop!=1)}voidm_PrintAllData(){cout<<"AllDataList:"<<for(intiLoop=0;iLoop t;++iLoop{cout<<m_DataList[iLoop]<<}cout<<}voidm_PrintPrimeData(){cout<<"PrimeDataList:"<<for(intiLoop=0;iLoop t;++iLoop{if(m_bIsPrimeData(m_DataList[iLoop]){cout<<m_DataList[iLoop]<<}}cout<<}vector<int>m_DataList; void{CDataSetDataList(10,100);}們預(yù)想的并不一致,甚至可能造成程序的!這是為什么呢?問(wèn)題處在DeletePrimeData()這個(gè)函數(shù),看for(it=m_DataList.begin();it!=m_DataList.end();++it{if(m_bIsPrimeData(*it){}} 777 tor為7果這種問(wèn)題發(fā)生在Vector的尾部的話(huà),就可能造成內(nèi)存的而引起程序的。那這個(gè)問(wèn)題該怎么解void{vector<int>TempList;vector<int>::i for(it=m_DataList.begin();it!=m_DataList.end();++it{if(!m_bIsPrimeData(*it){}}t=}Vector中的元素清空并用新Vector的元素進(jìn)行重新填充(m_DataList.assign(TempList.begin(),TempList.end());)。這樣做既可以避免在循環(huán)中刪除元素帶來(lái)的Itor,有可以在一定程度上提高效率List的基本相對(duì)于Vector的線性空間,List就復(fù)雜的多,它每次添加或者刪除一個(gè)元素,就會(huì)申請(qǐng)或者釋放一于元素的插入和刪除,List都是常數(shù)時(shí)間。temte<classT>struct_list_node{ } list<int>il;for(intiLoop=0;iLoop<5;++iLoop{il.push_back(iLoop}List之后list<intilListil.begin()==List常用構(gòu)造函Example:list<int>list(size_typeCountExample:list<int>il(3);list(size_typecount,constType&_ValExample:list<int>il(3,5)list(constlist&SourceListExample:list<int>SourceList(3,5)list<int>il(SourceList);其它常用成begin(clear(empty(紹一些不同于Vector的方法:voidmerge(list<Type,Allocator>&List2遞增的方式排序,Copy之后,將List2中的所有元素清空。list<int>List1;list<int>List2;List1.push_back(1List1.push_back(3List1.push_back(5List2.push_back(2List2.push_back(4List1.merge(List2);調(diào)用Merge之前,List1:1,3, List2:2,4,調(diào)用Merge之后,List1:1,2,3,4,5, List2:請(qǐng)注意,調(diào)用Merge之前,必須保證兩個(gè)List都是完全排序的,不然會(huì)產(chǎn)生一個(gè)比較的結(jié)果,而一般情況下,這種情況并不是用戶(hù)的本意(產(chǎn)生這種結(jié)果的原因可參考Merge的實(shí)現(xiàn)方法。如果是針對(duì)用戶(hù)自定義類(lèi)型的List,在使用這個(gè)函數(shù)之前,還要保證實(shí)現(xiàn)了operator<。voidlist<int>il; //List中元素為:2voidpush_front(constType&_Val說(shuō)明:向List的首位插入一個(gè)元素。list<int>il;voidlist<int>il;il.push_back(3il.push_back(1il.push_back(2List3,1,2il.sort();//List中的元素:1,2,3List的綜合示例到此類(lèi)的末尾位置。分析:每種都有自己的種類(lèi),并且每類(lèi)按照次序存放,說(shuō)明原有的順序不應(yīng)該被打亂,并且這ListList#include<iostream>#include<list>usingnamespace#defineNOINDEX enumeBookKind{ = =COMPUTER =ENGLISH+1, =CHEMISTRY+1,ALLBOOKKIND=PHYSICS+1,struct{booloperator==(constBook_t&_Right){return(iBookKind==_Right.iBookKind} iBookKind;//Book iBookIndex;//Book在一類(lèi)中的位static t[ALLBOOKKIND];//靜態(tài)成員,表示每種的數(shù) t[ALLBOOKKIND]={2,1,2,1voidPrint(list<Book_t>StudentList{list<Book_t torfor(it=StudentList.begin();it!=StudentList.end();++it{cout<<it->iBookKind<<"\t"<<it->iBookIndex<<}}list<Book_t torSeek(list<Book_t torit, t{for(intiLoop=0;iLoop t;++iLoop{}return}void{//現(xiàn)有constBook_tBookList[]{ CHEMISTRY, //將現(xiàn)有插入書(shū)list<Book_t BookCase(BookList,BookList+sizeof(BookList)/sizeof(Book_t)//constBook_tNewBookList[]{COMPUTER,NOINDEX,CHEMISTRY,NOINDEX,ENGLISH,NOINDEX,PHYSICS,NOINDEX,COMPUTER,NOINDEX,PHYSICS,NOINDEX t=sizeof(NewBookList)/sizeof(Book_tlist<Book_t>::i for(intiLoop=0;iLoop t;++iLoop{stTempBook=NewBookList[iLoop//找到相同種類(lèi)的第一個(gè)位置,在這里默認(rèn)為每種都存在至少一本it=find(BookCase.begin(),BookCase.end(),stTempBook//更新新插入的書(shū)在此類(lèi)位 //指針偏移到下一類(lèi)書(shū)的開(kāi)頭并將新書(shū)插入(因?yàn)椴迦氩僮魇乔安迦?it=Seek(it, t[it->iBookKind]++);BookCase.insert(it,stTempBook);}}關(guān)聯(lián)式容(alue黑樹(shù)(RB-Tree),因?yàn)闃?shù)提供了很好的搜索效率。(Key,Set元素中的實(shí)值就是鍵值,鍵值就是實(shí)值;Set不允許兩個(gè)元素?fù)碛邢嗤逆I值。常用構(gòu)造函set<int>set(const_set&_Rightset<int>is1;is1.insert(0);is1.insert(1set<int>is2(is1其他成員函Size_typecount(constkey&_Key)所以此返回值只有1和0兩種情況。set<int>is.insert(1is.insert(1intiCnt=is.count(1) t=1iCnt=is.count(2); t=0pair< tor, tor equal_range(constKey&_Key于_Key的迭代子,second為Key值大于_Key的迭代子。set<int>pair<set<int tor,set<int tor>is.insert(0is.insert(1is.insert(2Ret=is.equal_range(1Ret=is.equal_range(2);//*Ret.first=2;Ret.second= torfind(constKey&_Keyfind()find()方法的容器最好使用自帶的方法,因?yàn)橥ㄓ玫膄ind()沒(méi)有針對(duì)容器做過(guò)優(yōu)化,在效率方面劣于自帶的方法。set<int>is;is.insert(0is.insert(1is.insert(2if(is.find(1)!=is.end(){Do}pair< tor,bool>insert( value_type&Value變量指向原元素存在的位置;如果插入元素的key不存在,則bool值為true,返回新插入元素的迭代子。set<int>pair<set<int tor,bool>Ret=is.insert(1);//ret.second=trueRet=is.insert(2);//ret.second=trueRet=is.insert(1);//ret.second=false p()set<int,lessintis1;//set<int,less<int>> parekcl1= boolb=kcl1(1,2);//b=trueset<int,greater<intis2set<int,greater<int>> parekcl2= b=kcl2(1,2); //b=false p() itorlower_bound(constKey&_Key)說(shuō)明:返回大于或者等于_Key的第一個(gè)元素的迭代子set<int>is;is.insert(0is.insert(1is.insert(3inti=*(is.lower_bound(1));//i=1i=*(is.lower_bound(2));//i=3 torupper_boundconstKey&_Key說(shuō)明:返回大于_Key的第一個(gè)元素的迭代子set<int>is;is.insert(0is.insert(1is.insert(3inti=*(is.up_bound(1));//i*isup_bound3i=3存在Key值相同的元素。下面介紹幾個(gè)multiset常用的方法size_typecount(constKey&_Key)數(shù)multiset<int>is;is.insert(0);is.insert(1is.insert(1is.insert(2intiCnt=is.count(1); t=2iCnt=is.count(2); t=1SetMultiSet的綜合示例戶(hù)選擇的號(hào)碼不存在的時(shí)候返回相應(yīng)的信息。用戶(hù)可以隨時(shí)按照號(hào)碼從小到大的順序查看所有的情set#include<iostream>#include<set>#include<stdlib.h>#include<time.h>usingnamespace#defineRANDOM enumeReturnCode{SUCCESS=WRONG_NUMBER=SUCCESS+1,NUMBER_EXIST=WRONG_NUMBER+1,ALLNUMBER_EXIST=NUMBER_EXIST+1struct{friendbooloperator<(constLottery_t&_Left,constLottery_t&_Right{return(_Left.iLotteryNum<_Right.iLotteryNum}//號(hào)int// class{CLotteryProduction():m_MaxNum(10{srand((unsigned)time(NULL)}eReturnCodeBuyLottery(Lottery_tintiLotteryNum=RANDOM, t=1){//if(m_LotteryList.size()==m_MaxNum+1{return}//if((iLotteryNum>m_MaxNum)||(iLotteryNum<0){return}Lottery_tstLotteryForEntry;if(RANDOM==iLotteryNum){//產(chǎn)生一個(gè)隨機(jī)號(hào)碼,for(;;{ t= pair<set<Lottery_t tor,bool>Retm_LotteryList.insert(stLotteryForEntryif(Ret.second{}}{

}//按照用戶(hù)選擇的號(hào)碼生成 t= pair<set<Lottery_t>::i tor,bool>Ret=m_LotteryList.insert(stLotteryForEntryif(Ret.second{return}}*pLottery=return}voidDisy(){set<Lottery_t torcout<<"LotteryNo\t"<< t"<<for(it=m_LotteryList.begin();it!=m_LotteryList.end();++it{cout<<it->iLotteryNum<<"\t"<<it- t<<}}intGetRandomNum(){return(rand()%(m_MaxNum+1)}set<Lottery_t>m_LotteryList;constint void{eReturnCodeRet;for(;;{Lottery_t//一if(ALLNUMBER_EXIST==Ret){}}//顯示的信}Map的特性是,所有元素都會(huì)根據(jù)元素的鍵值自動(dòng)被排序。Mappair(Keymap<int,constchar*>map(constmap&_Rightmap<int,constchar*>MemberList1;MemberList1.insert(make_pair(0,“Mike”));map<int,constchar*>MemberList2(MemberList1其它常用成 torfind(constKey&_Keymap<int,constchar*>MemberList1;MemberList1.insert(make_pair(0,“Mike”));MemberList1.insert(make_pair(1,“Tom”));pair< tor,bool>insert(constvalue_type&_Val說(shuō)明:插入一個(gè)元素,如果此元素不存在,返回值pair中的booltrue,false,pair中的first表map<int,string>typedefmap<int,string>::i torMapIt;pair<MapIt,bool>Ret;Ret=MemberList1.insert(make_pair(0,string(“Mike”))//此時(shí)*Ret.first0,“MikeRet.secondRet=MemberList1.insert(make_pair(1,string(“Tom”))//此時(shí)*Ret.first1,“TomRet.secondRet=MemberList1.insert(make_pair(1,string(“Mary”))//此時(shí)*Ret.first1,“Tom”Ret.second p()map<int,string>MemberList;map<int,string> parekcl;kcl= boolb=kcl(1,2);//b=trueb=kcl(2,1);//b=false; p()此函數(shù)實(shí)際上還是通過(guò)比較兩個(gè)元素的Key值來(lái)確定它們的位置關(guān)系。map<int,string>typedefmap<int,string> Pvcl=MemberList. boolb=vcl(make_pair(0,string(“Mike”)),make_pair(1,string(“Tom”))//bb=vcl(make_pair(1,string(“Tom”)make_pair(0,string(“Mike”))//bType&operator[](constKey&_Key說(shuō)明:在map<int,string>MemberList.insert(make_pair(0,string(“Mike”)));MemberList.insert(make_pair(1,string(“Tom”))map<int,string>::i torit;it=MemberList.find(1);MemberList[it->first]=multimapmap的示例分析:這個(gè)題目中要求進(jìn)行排序,并且能夠隨時(shí)改變排序的方式,所以應(yīng)該選擇map或者multimap,這樣改變排序方式應(yīng)該更容易一些。同時(shí),考慮到學(xué)生的屬性(身高、體重和)有可能一致,所以我們multimap。#include<iostream>#include<map>usingnamespacestd;enum{ =0,QUEUE_BY_WEIGHT=QUEUE_BY_HIGH+1,QUEUE_BY_AGE=QUEUE_BY_WEIGHT+1,struct{friendbooloperator>(constStudent_t&_Left,constStudent_t&_Right{return(_Left.iHigh>_Right.iHigh}intiHigh;intiAge;class{構(gòu)造函數(shù), m_QueueKind(QueueKind){}//voidInsertStudent(constStudent_t*pInputList, t{switch(m_QueueKind{caseInsertByHigh(pInputList, caseInsertByWeight(pInputList, caseInsertByAge(pInputList, }}voidDisy(){cout<<"High\t"<<"Weight\t"<<"Age"<<endl;multimap<int,Student_t,greater<int>>::const_i torit;for(it=m_StudentList.begin();it!=m_Stude

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論