版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一、模板簡(jiǎn)單介紹 二、STL概 三、STL的組件以及關(guān) 四、常用容器介 五、寫在后 六、附錄:如何選擇容 一、模板簡(jiǎn)單介紹函數(shù)模要求:此函數(shù)可以接受int、char以及double類型的參數(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)方式,完全沒有必要去記住哪個(gè)函數(shù)對(duì)應(yīng)哪種數(shù)據(jù)類型,因?yàn)椴还苁轻槍?duì)哪種數(shù)據(jù)類型的比較,只需要簡(jiǎn)單的調(diào)用Max()就可temte<classTTMax(constT&Input1,constT&Input2{return(Input1>Input2)?Input1:}甚至任何自定義類型(只要你實(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í)候的開銷,因?yàn)槲覀儾恢繲類型到底有多大。類模#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ù)雜。不過STL設(shè)計(jì)的思想正是基于模板。二、STL先進(jìn)技術(shù)與深厚理論的產(chǎn)品。說他是產(chǎn)品也可以,說他是規(guī)格也可以,說是軟件組件技術(shù)發(fā)展史上一個(gè)讓工程師/程序員的心血不至于隨時(shí)間的推移、人事異動(dòng)而煙消云散。從副程式(subroutines)、程序(procedures、函數(shù)(functions)、類別(classes),到函數(shù)庫(functionlibraries、類別庫(classlibraries)、各種組件(components),從結(jié)構(gòu)化設(shè)計(jì)、模組化設(shè)計(jì)、物件導(dǎo)向設(shè)計(jì),到樣式(patterns)STL就是在這個(gè)背景下誕生的。STL的價(jià)值在兩方面。低層次而言,STL帶給我們一套急具價(jià)值的零組件,這種價(jià)值就像MFC對(duì)于Windows開發(fā)過程所帶來的價(jià)值一樣,直接而。除此之外STL還帶給我們一個(gè)次的以泛型思維為基礎(chǔ)的設(shè)計(jì)理念。在這個(gè)里面,我們只會(huì)提到如何使用STL,對(duì)于次的三、 的組件以及關(guān) STL六大組件的關(guān)系如下圖所示:Container通過Allocator取得數(shù)據(jù)空間,Algorithm通過Itor存Container內(nèi)容,F(xiàn)unctor可以協(xié)助Algorithm完成不同的策略變化,Adapter可以修飾或者套接Funtor。四、常用容器介序列式容序列式容器包括:Vector、List、Queue、Stack等。Vector基本結(jié)Vectr是說你完全可以不必關(guān)心你到底向這個(gè)數(shù)組里面添加了多少個(gè)元素,繼續(xù)添加就對(duì)了(當(dāng)然內(nèi)存耗盡。實(shí)際上,Vector的實(shí)現(xiàn)就像文章開頭所舉的例子一樣,在初始化的時(shí)候,會(huì)申請(qǐng)一定的空間用來數(shù)vector<int>iv(1)00110iv.size()==iv.capacity()==012iv.size()==3;iv.capacity()==4;可以觀察到,VectorPush操Vector的一個(gè)策略,前面提到過,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說明:返回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來講,它的迭代器在使用的時(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[]只能用來取得已經(jīng)存在的元素,而不能向vector中添加元素,例如下面的代碼是錯(cuò)誤vector<int>iv01;//錯(cuò)誤,vector的空間還沒有被分2、operator[]和正常數(shù)組的使用方法一樣,也同樣沒有越界檢查,比如你通過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ù)想的并不一致,甚至可能造成程序的!這是為什么呢?問題處在DeletePrimeData()這個(gè)函數(shù),看for(it=m_DataList.begin();it!=m_DataList.end();++it{if(m_bIsPrimeData(*it){}} 777 tor為7果這種問題發(fā)生在Vector的尾部的話,就可能造成內(nèi)存的而引起程序的。那這個(gè)問題該怎么解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)中刪除元素帶來的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é)果,而一般情況下,這種情況并不是用戶的本意(產(chǎn)生這種結(jié)果的原因可參考Merge的實(shí)現(xiàn)方法。如果是針對(duì)用戶自定義類型的List,在使用這個(gè)函數(shù)之前,還要保證實(shí)現(xiàn)了operator<。voidlist<int>il; //List中元素為:2voidpush_front(constType&_Val說明:向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的綜合示例到此類的末尾位置。分析:每種都有自己的種類,并且每類按照次序存放,說明原有的順序不應(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在一類中的位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)有插入書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//找到相同種類的第一個(gè)位置,在這里默認(rèn)為每種都存在至少一本it=find(BookCase.begin(),BookCase.end(),stTempBook//更新新插入的書在此類位 //指針偏移到下一類書的開頭并將新書插入(因?yàn)椴迦氩僮魇乔安迦?it=Seek(it, t[it->iBookKind]++);BookCase.insert(it,stTempBook);}}關(guān)聯(lián)式容(alue黑樹(RB-Tree),因?yàn)闃涮峁┝撕芎玫乃阉餍?。(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()沒有針對(duì)容器做過優(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)說明:返回大于或者等于_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說明:返回大于_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ào)碼不存在的時(shí)候返回相應(yīng)的信息。用戶可以隨時(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à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說明:插入一個(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í)際上還是通過比較兩個(gè)元素的Key值來確定它們的位置關(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說明:在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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 樓房加固施工方案(3篇)
- 2025年山西省職教高考《語文》核心考點(diǎn)必刷必練試題庫(含答案)
- 《國防動(dòng)員法》考試題庫100題(含答案)
- 2025年池州職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 2025年武威職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 2025年棗莊科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年常考版參考題庫含答案解析
- 專題05 名句名篇默寫(第3期)
- 消防工程維修合同書
- 廣西二手房買賣合同
- 建材購銷合同格式范本
- 2025年度院感管理工作計(jì)劃(后附表格版)
- 勵(lì)志課件-如何做好本職工作
- 2024年山東省濟(jì)南市中考英語試題卷(含答案解析)
- 2024年社區(qū)警務(wù)規(guī)范考試題庫
- 2025中考英語作文預(yù)測(cè):19個(gè)熱點(diǎn)話題及范文
- 第10講 牛頓運(yùn)動(dòng)定律的綜合應(yīng)用(一)(講義)(解析版)-2025年高考物理一輪復(fù)習(xí)講練測(cè)(新教材新高考)
- 暑假作業(yè) 10 高二英語完形填空20篇(原卷版)-【暑假分層作業(yè)】2024年高二英語暑假培優(yōu)練(人教版2019)
- 衛(wèi)生院安全生產(chǎn)知識(shí)培訓(xùn)課件
- 語文七年級(jí)下字帖打印版
- 兒童尿道黏膜脫垂介紹演示培訓(xùn)課件
- 《民航服務(wù)溝通技巧(第2版)》王建輝教案 第7課 有效處理投訴
評(píng)論
0/150
提交評(píng)論