標準模板類庫_第1頁
標準模板類庫_第2頁
標準模板類庫_第3頁
標準模板類庫_第4頁
標準模板類庫_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

標準模板類庫第1頁,共79頁,2023年,2月20日,星期五C++語言的標準模板類庫STL(StandardTemplateLibrary)已經(jīng)成為一個標準,它是一個基于模板的群性類庫,包含群體類(鏈表、向量、棧、隊列、集合、映象),算法(排序、查找)以及迭代子(iterator)。本章將著重介紹STL的使用。實現(xiàn)了數(shù)組和鏈表,它們屬于線性群體。還有兩種特殊的線性群體:棧和隊列。Ele1……Ele2Elen入棧出棧棧頂棧底圖 棧的示意圖棧是只能從一端訪問的線性群體,可以訪問的這一端稱棧頂,另一端稱棧底。對棧頂位置的標記稱為棧頂指針,對棧底位置的標記稱為棧底指針。向棧頂添加元素稱為“壓入棧”(push),刪除棧頂元素稱為“彈出棧”(pop)。棧中元素的添加和刪除操作具有“后進先出”(LIFO)的特性?!?/p>

11.1基本數(shù)據(jù)結(jié)構(gòu)知識】第2頁,共79頁,2023年,2月20日,星期五有一種限定的線性數(shù)據(jù)群體叫雙端隊列,它類似于限定刪除和插入操作都必須在兩端進行的鏈表。隊列是一種特殊的線性群體。隊列只能向一端添加元素,從另一端刪除元素的線性群體,可以添加元素的一端稱隊尾,可以刪除元素的一端稱隊頭。對隊頭位置的標記稱為隊頭指針,對隊尾位置的標記稱為隊尾指針。Ele1出隊入隊Ele2Elen……隊頭隊尾非線性群體:集合和映射。集合由若干個元素組成,對于一個指定的元素,它或者屬于該集合,或者不屬于;可以對兩個集合求交集和差等。映射則類似于字典的功能,如一個身份證號碼可以映射為某個確定的人,圖書館中一本書的編號和這本書也是一個映射。

向隊尾添加元素稱為“入隊”,刪除隊頭元素稱為“出隊”。隊列中元素的添加和刪除操作具有“先進先出”(FIFO)的特性。圖 隊列的邏輯結(jié)構(gòu)示意圖第3頁,共79頁,2023年,2月20日,星期五11.2.1泛型程序設(shè)計將程序?qū)懙帽M可能通用將算法從特定的數(shù)據(jù)結(jié)構(gòu)中抽象出來,成為通用的C++的模板為泛型程序設(shè)計奠定了關(guān)鍵的基礎(chǔ)STL是泛型程序設(shè)計的一個范例容器(container)迭代器(iterator)算法(algorithms)函數(shù)對象(functionobject)【

11.2泛型程序設(shè)計與標準模板類庫STL簡介】4第4頁,共79頁,2023年,2月20日,星期五命名空間(Namespace)一個命名空間將不同的標識符集合在一個命名作用域(namedscope)內(nèi)為了解決命名沖突例如,聲明一個命名空間NS:namspaceNS{classFile;voidFun();}

則引用標識符的方式如下,NS::Fileobj;NS::Fun();沒有聲明命名空間的標識符都處于無名的命名空間中概念和術(shù)語5第5頁,共79頁,2023年,2月20日,星期五命名空間(Namespace)可以用using來指定命名空間例如,經(jīng)過以下聲明:

usingNS::File;

在當前作用域中就可以直接引用Fileusingnamespacestd;

命名空間std中所有標識符都可直接引用在新的C++標準程序庫中,所有標識符都聲明在命名空間std中,頭文件都不使用擴展名概念和術(shù)語6第6頁,共79頁,2023年,2月20日,星期五容器容器類是容納、包含一組元素或元素集合的對象。異類容器類與同類容器類順序容器與關(guān)聯(lián)容器七種基本容器:向量(vector)、雙端隊列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)概念和術(shù)語7第7頁,共79頁,2023年,2月20日,星期五容器的接口通用容器運算符==,!=,>,>=,<,<=,=方法(函數(shù))迭代方法begin(),end(),rbegin(),rend()訪問方法size(),max_size(),swap(),empty()8第8頁,共79頁,2023年,2月20日,星期五適配器適配器是一種接口類為已有的類提供新的接口。目的是簡化、約束、使之安全、隱藏或者改變被修改類提供的服務(wù)集合。三種類型的適配器:容器適配器用來擴展7種基本容器,它們和順序容器相結(jié)合構(gòu)成棧、隊列和優(yōu)先隊列容器迭代器適配器函數(shù)對象適配器。概念和術(shù)語9第9頁,共79頁,2023年,2月20日,星期五迭代器迭代器是面向?qū)ο蟀姹镜闹羔?,它們提供了訪問容器、序列中每個元素的方法。概念和術(shù)語10第10頁,共79頁,2023年,2月20日,星期五算法C++標準模板庫中包括70多個算法其中包括查找算法,排序算法,消除算法,記數(shù)算法,比較算法,變換算法,置換算法和容器管理等等。這些算法的一個最重要的特性就是它們的統(tǒng)一性,并且可以廣泛用于不同的對象和內(nèi)置的數(shù)據(jù)類型。概念和術(shù)語11第11頁,共79頁,2023年,2月20日,星期五函數(shù)對象一個行為類似函數(shù)的對象,它可以不需參數(shù),也可以帶有若干參數(shù),其功能是獲取一個值,或者改變操作的狀態(tài)。任何普通的函數(shù)和任何重載了調(diào)用運算符operator()的類的對象都滿足函數(shù)對象的特征STL中也定義了一些標準的函數(shù)對象,如果以功能劃分,可以分為算術(shù)運算、關(guān)系運算、邏輯運算三大類。為了調(diào)用這些標準函數(shù)對象,需要包含頭文件<functional>。12第12頁,共79頁,2023年,2月20日,星期五1994年7月,STL正式成為標準C++庫的一部分。STL中的群體類是基于模板的,它既包含線性群體類,也包含非線性群體類,其中主要有: vector(向量) list(鏈表) stack(棧) queue(隊列) deque(雙端隊列) set(集合) map(映射)STL的迭代子可以看成是指針的推廣,迭代子也可以是普通的指針。類型分類順序訪問:直接訪問:順序迭代子使用++、--等進行移動,但只能順序訪問群體類中的對象。直接訪問迭代子則可以直接訪問群體類中的某個特定對象?!?/p>

11.2.2標準模板類庫STL簡介】第13頁,共79頁,2023年,2月20日,星期五STL的算法是用函數(shù)模板實現(xiàn)的,可以實現(xiàn)對不同類型對象的通用操作。排序(sort、merge)查找(find、search)比較(equal)集合(includes、setunion、setdifference)計算(accumulate、partialsum)統(tǒng)計(max、min)管理(swap、fill、replace、copy、unique、rotate、reverse)堆操作(makeheap、pushheap、popheap、sortheap)算法與STL群體類之間是通過迭代子來進行溝通的,算法面向迭代子,迭代子則面向群體類,對于迭代子,可以將它理解為一個指針,通過它我們可以獲得群體類內(nèi)部的數(shù)據(jù)對象,然后算法對這個由迭代子獲得的對象進行操作。STL的主要算法有:第14頁,共79頁,2023年,2月20日,星期五C++語言標準類庫提供了向量群體類,向量既有象數(shù)組一樣可以對群體類內(nèi)部對象進行直接訪問的特點,也有類似于鏈表可以對群體類內(nèi)部對象進行順序訪問的特點,同時向量具有動態(tài)特征,所以C++語言中的向量群體類具有數(shù)組和鏈表兩者的優(yōu)點。向量模板類中較為重要的成員函數(shù)有begin、end、insert、erase、operator[]等。iteratorinsert(iteratorit,constT&x=T());//將x復制到it位置之前voidinsert(iteratorit,sizetypen,constT&x);//將n個x復制到it位置之前voidinsert(iteratorit,constiteratorfirst,constiteratorlast);//將first和last

//之間的對象復制到it位置之前iteratorerase(iteratorit);//移走it位置的對象iteratorerase(iteratorfirst,iteratorlast);//移走first到last之間的對象用法如下:begin返回指向該向量的第一個對象的迭代子。end返回一個指向向量末尾值的迭代子。insert和erase是向量類的插入和刪除方法?!?/p>

11.3向量】第15頁,共79頁,2023年,2月20日,星期五向量應(yīng)用舉例(一)//EXAMPLE11_1.CPP#include<iostream>#include<numeric>#include<algorithm>#include<vector>#include<iterator>usingnamespacestd;voidmain(){ 說明一下copy和accumulate函數(shù)的用法:template<classInIt,classOutIt>OutItcopy(InItfirst,InItlast,OutItx);//該函

//數(shù)將從first到last之間的對象依次賦給位置x的對象,

//同時x++。在本例中是賦給標準輸出流。template<classInIt,classT>Taccumulate(InItfirst,InItlast,Tval);//在first

//和last之間依次取得對象值,每次該值與val的和替代原val值,返回val。template<classInIt,classT,classPred>Taccumulate(InItfirst,InItlast,Tval,Predpr);//在first和last之間依次取得對象值,每次該值與val進行pr運算后得到的

//新值(在例中用到multiplies,進行乘法運算)替代原val值,返回val。例11-1第16頁,共79頁,2023年,2月20日,星期五vector<int>nMyVector1,//整型向量nMyVector2;

//該向量類型的迭代子vector<int>::iteratornItBegin,nItEnd;

//該向量類型的輸出流迭代子ostreamiterator<int>nOutput(cout,″″);

//對向量類型對象中的數(shù)據(jù)進行順序賦值for(inti=1;i<=10;i++){nMyVector1.pushback(i);}

//將該向量類型對象中的數(shù)據(jù)輸出到標準輸出流,顯示出來。copy(nMyVector1.begin(),nMyVector1.end(),nOutput);cout<<endl;

//該向量類型的迭代子被賦值nItBegin=nMyVector1.begin();nItEnd=nMyVector1.end(); (續(xù))第17頁,共79頁,2023年,2月20日,星期五

//用insert函數(shù)實現(xiàn)兩個向量類型對象成員數(shù)據(jù)的復制nMyVector2.insert(nMyVector2.begin(),nMyVector1.begin(),nMyVector1.end());for(i=0;i<nMyVector2.size();i++){cout<<nMyVector2[i]<<″″;}cout<<endl;

//用迭代子輸出該向量類型對象的數(shù)據(jù)while(nItBegin!=nItEnd){cout<<*nItBegin<<″″;nItBegin++;}cout<<endl;

//用標準算法得到整型向量對象中所有數(shù)據(jù)的和cout<<″ThesumofnMyVector1[i]is:″<<accumulate(nMyVector1.begin(),nMyVector1.end(),0.0f)<<endl;

nItBegin=nMyVector1.begin();nItEnd=nMyVector1.end(); (續(xù))第18頁,共79頁,2023年,2月20日,星期五

//用一個已經(jīng)存在的向量對象初始化另一個向量對象vector<int>nMyVector3(nItBegin,nItEnd);vector<int>nMyVector4(nMyVector3);

//輸出兩個新的向量對象copy(nMyVector3.begin(),nMyVector3.end(),nOutput);cout<<endl;copy(nMyVector4.begin(),nMyVector4.end(),nOutput);cout<<endl;}123456789101234567891012345678910ThesumofnMyVector1[i]is:551234567891012345678910(續(xù))第19頁,共79頁,2023年,2月20日,星期五向量應(yīng)用舉例(二)//EXAMPLE11_2.CPP//程序開始#pragmawarning(disable:4786)//防止一個編譯警告的出現(xiàn),過長的標識符(例如變

//量名字長度超過255個)將在debug(程序調(diào)試狀態(tài))下被截斷,以下同#include<iostream>#include<numeric>#include<algorithm>#include<functional>#include<vector>#include<iterator>#include<string>usingnamespacestd;/*聲明使用std名稱空間,這里名空間是ANSIC++為解決C/C++程序員經(jīng)常遇到的命名沖突而采取的一個措施,名空間內(nèi)的變量、函數(shù)與其他名空間內(nèi)的同名變量或者函數(shù)無關(guān),這樣增加了程序員對變量和函數(shù)命名的靈活性。std是標準名空間。*/classPoint//Point類的聲明及實現(xiàn){private://聲明私有數(shù)據(jù)成員 例11-2第20頁,共79頁,2023年,2月20日,星期五intx;inty;public://聲明對外接口Point(intxx=0,intyy=0)//帶默認形參值的構(gòu)造函數(shù){x=xx;y=yy;}voiddisplay()//顯示函數(shù){cout<<″Point″<<″(″<<x<<″,″<<y<<″)″<<″″;}intgetx()const{returnx;}intgety()const{returny;}booloperator==(constPoint&point2)const;//用戶自定義類型必須重載″==″和

//″<″運算符,因為STL中的模板類都要支持關(guān)系運算如″>=″、″<=″。booloperator<(constPoint&point2)const;};boolPoint::operator==(constPoint&point2)const{if((x==point2.getx())&&(y==point2.gety())) (續(xù))第21頁,共79頁,2023年,2月20日,星期五returntrue;elsereturnfalse;}boolPoint::operator<(constPoint&point2)const{if((getx()<point2.getx())&&(gety()<point2.gety()))returntrue;elsereturnfalse;}voidmain(){vector<int>nMyVector1,//整型向量nMyVector2;vector<double>dblMyVector1,//雙精度型向量dblMyVector2;vector<char>cMyVector1,//字符型向量cMyVector2;vector<string>strMyVector1,//字符串型向量strMyVector2;vector<Point>ptMyVector1,//Point型向量 (續(xù))第22頁,共79頁,2023年,2月20日,星期五ptMyVector2;

//針對不同向量類型的迭代子vector<int>::iteratornItBegin,nItEnd;vector<double>::iteratordblItBegin,dblItEnd;vector<char>::iteratorcItBegin,cItEnd;vector<string>::iteratorstrItBegin,strItEnd;vector<Point>::iteratorptItBegin,ptItEnd;

//針對不同向量類型的輸出流迭代子ostreamiterator<int>nOutput(cout,″″);ostreamiterator<double>dblOutput(cout,″″);ostreamiterator<char>cOutput(cout,″″);ostreamiterator<string>strOutput(cout,″″);

//向各種向量類型對象中寫入數(shù)據(jù)for(inti=1;i<=10;i++){nMyVector1.pushback(i);dblMyVector1.pushback(i/10.0);cMyVector1.pushback(′A′+i); (續(xù))第23頁,共79頁,2023年,2月20日,星期五Point*point=newPoint(i,i);ptMyVector1.pushback(*point);}strMyVector1.pushback(″I″);strMyVector1.pushback(″Like″);strMyVector1.pushback(″C++!″);

//將不同向量類型對象中的數(shù)據(jù)輸出到標準輸出流,顯示出來。copy(nMyVector1.begin(),nMyVector1.end(),nOutput);cout<<endl;copy(dblMyVector1.begin(),dblMyVector1.end(),dblOutput);cout<<endl;copy(cMyVector1.begin(),cMyVector1.end(),cOutput);cout<<endl;copy(strMyVector1.begin(),strMyVector1.end(),strOutput);cout<<endl;

//各個向量類型的迭代子被賦值nItBegin=nMyVector1.begin();dblItBegin=dblMyVector1.begin(); (續(xù))第24頁,共79頁,2023年,2月20日,星期五cItBegin=cMyVector1.begin();strItBegin=strMyVector1.begin();ptItBegin=ptMyVector1.begin();nItEnd=nMyVector1.end();dblItEnd=dblMyVector1.end();cItEnd=cMyVector1.end();strItEnd=strMyVector1.end();ptItEnd=ptMyVector1.end();

//用insert函數(shù)實現(xiàn)兩個向量類型對象成員數(shù)據(jù)的復制nMyVector2.insert(nMyVector2.begin(),nMyVector1.begin(),nMyVector1.end());for(i=0;i<nMyVector2.size();i++){cout<<nMyVector2[i]<<″″;}cout<<endl;dblMyVector2.insert(dblMyVector2.begin(),dblMyVector1.begin(),dblMyVector1.end());for(i=0;i<dblMyVector2.size();i++){ (續(xù))第25頁,共79頁,2023年,2月20日,星期五cout<<dblMyVector2[i]<<″″;}cout<<endl;cMyVector2.insert(cMyVector2.begin(),cMyVector1.begin(),cMyVector1.end());for(i=0;i<cMyVector2.size();i++){cout<<cMyVector2[i]<<″″;}cout<<endl;strMyVector2.insert(strMyVector2.begin(),strMyVector1.begin(),strMyVector1.end());for(i=0;i<strMyVector2.size();i++){cout<<strMyVector2[i]<<″″;}cout<<endl;ptMyVector2.insert(ptMyVector2.begin(),ptMyVector1.begin(),ptMyVector1.end());for(i=0;i<ptMyVector2.size();i++){ (續(xù))第26頁,共79頁,2023年,2月20日,星期五intstaticcount=0;if(count==5){count=0;cout<<endl;}ptMyVector2[i].display();count++;}cout<<endl;//用迭代子輸出不同向量類型對象的數(shù)據(jù)while(nItBegin!=nItEnd){cout<<*nItBegin<<″″;nItBegin++;}cout<<endl;while(dblItBegin!=dblItEnd){ (續(xù))第27頁,共79頁,2023年,2月20日,星期五cout<<*dblItBegin<<″″;dblItBegin+=2;}cout<<endl;while(cItEnd!=cItBegin){cout<<*(--cItEnd)<<″″;}cout<<endl;while(strItBegin!=strItEnd){cout<<*strItBegin<<″″;strItBegin++;}cout<<endl;while(ptItBegin!=ptItEnd){intstaticcount=0;if(count==5) (續(xù))第28頁,共79頁,2023年,2月20日,星期五{count=0;cout<<endl;}ptItBegin->display();ptItBegin++;count++;}cout<<endl;

//用標準算法得到整型向量對象中所有數(shù)據(jù)的和cout<<″ThesumofnMyVector1[i]is:″ <<accumulate(nMyVector1.begin(),nMyVector1.end(),0.0f) <<endl;

//用標準算法得到雙精度型向量對象中所有數(shù)據(jù)的積cout<<″ThemultipliesofdblMyVector1[i]is:″<<accumulate(dblMyVector1.begin(),dblMyVector1.end(),1.0f,multiplies<double>())<<endl;

(續(xù))第29頁,共79頁,2023年,2月20日,星期五

//從字符型向量對象中彈出數(shù)據(jù)for(i=0;i<5;i++){cItEnd=cMyVector1.end();cout<<″TheElementwillbepopis:″<<*(--cItEnd)<<endl;cMyVector1.popback();}cItEnd=cMyVector1.end();cItBegin=cMyVector1.begin();

//輸出彈出數(shù)據(jù)后的字符型向量對象的數(shù)據(jù)while(cItBegin!=cItEnd){cout<<*cItBegin<<″″;cItBegin++;}cout<<endl;nItBegin=nMyVector1.begin();nItEnd=nMyVector1.end(); (續(xù))第30頁,共79頁,2023年,2月20日,星期五

//用一個已經(jīng)存在的向量對象初始化另一個向量對象vector<int>nMyVector3(nItBegin,nItEnd);vector<int>nMyVector4(nMyVector3);

//輸出兩個新的向量對象copy(nMyVector3.begin(),nMyVector3.end(),nOutput);cout<<endl;copy(nMyVector4.begin(),nMyVector4.end(),nOutput);cout<<endl;}//源程序結(jié)束(續(xù))第31頁,共79頁,2023年,2月20日,星期五123456789100.10.20.30.40.50.60.70.80.91BCDEFGHIJKILikeC++!123456789100.10.20.30.40.50.60.70.80.91BCDEFGHIJKILikeC++!Point(1,1)Point(2,2)Point(3,3)Point(4,4)Point(5,5)Point(6,6)Point(7,7)Point(8,8)Point(9,9)Point(10,10)ThesumofnMyVector1[i]is:55ThemultipliesofdblMyVector[i]is:0.00036288TheElementwillbepopis:KTheElementwillbepopis:JTheElementwillbepopis:ITheElementwillbepopis:HTheElementwillbepopis:GBCDEF1234567891012345678910(續(xù))第32頁,共79頁,2023年,2月20日,星期五鏈表類中比較重要的成員函數(shù)與向量基本相同,但注意鏈表類不包含[]運算符重載,也沒有+=或-=重載,這一點與向量不同。例11-3鏈表類應(yīng)用舉例//EXAMPLE11_3.CPP//源程序開始#pragmawarning(disable:4786)//防止一個編譯警告的出現(xiàn)#include<iostream>#include<numeric>#include<algorithm>#include<functional>#include<list>#include<iterator>#include<string>usingnamespacestd;//聲明使用std名稱空間 (續(xù))【

11.4鏈表類的使用】第33頁,共79頁,2023年,2月20日,星期五classPoint//Point類的聲明及實現(xiàn){private://聲明私有數(shù)據(jù)成員intx;inty;public://聲明對外接口Point(intxx=0,intyy=0)//帶默認形參值的構(gòu)造函數(shù){x=xx;y=yy;}voiddisplay()//顯示函數(shù){cout<<″Point″<<″(″<<x<<″,″<<y<<″)″<<″″;}intgetx()const{returnx;}intgety()const{returny;}booloperator==(constPoint&point2)const;booloperator<(constPoint&point2)const;}; 鏈表類應(yīng)用舉例例11-3第34頁,共79頁,2023年,2月20日,星期五boolPoint::operator==(constPoint&point2)const{if((x==point2.getx())&&(y==point2.gety()))returntrue;elsereturnfalse;}boolPoint::operator<(constPoint&point2)const{if((getx()<point2.getx())&&(gety()<point2.gety()))returntrue;elsereturnfalse;}voidmain(){list<int>nMyList1,//整型list MyList2;list<double>dblMyList1,//雙精度型list dblMyList2; (續(xù))第35頁,共79頁,2023年,2月20日,星期五list<char>cMyList1,//字符型list cMyList2;list<string>strMyList1,//字符串型list strMyList2;list<Point>ptMyList1,//Point型list ptMyList2

//針對不同list類型的迭代子list<int>::iteratornItBegin1,nItEnd1,nItBegin2,nItEnd2;list<double>::iteratordblItBegin1,dblItEnd1,dblItBegin2,dblItEnd2;list<char>::iteratorcItBegin1,cItEnd1,cItBegin2,cItEnd2;list<string>::iteratorstrItBegin1,strItEnd1,strItBegin2,strItEnd2;list<Point>::iteratorptItBegin1,ptItEnd1,ptItBegin2,ptItEnd2;//針對不同list類型的輸出流迭代子ostreamiterator<int>nOutput(cout,″″); (續(xù))第36頁,共79頁,2023年,2月20日,星期五ostreamiterator<double>dblOutput(cout,″″);ostreamiterator<char>cOutput(cout,″″);ostreamiterator<string>strOutput(cout,″″);//對list類型對象中的數(shù)據(jù)賦值for(inti=1;i<=10;i++){nMyList1.pushback(i);dblMyList1.pushback(i/10.0);cMyList1.pushback(′A′+i);Point*point=newPoint(i,i);ptMyList1.pushback(*point);}strMyList1.pushback(″I″);strMyList1.pushback(″Like″);strMyList1.pushback(″C++!″);//將不同list類型對象中的數(shù)據(jù)輸出到標準輸出流,顯示出來。copy(nMyList1.begin(),nMyList1.end(),nOutput);cout<<endl; (續(xù))第37頁,共79頁,2023年,2月20日,星期五copy(dblMyList1.begin(),dblMyList1.end(),dblOutput);cout<<endl;copy(cMyList1.begin(),cMyList1.end(),cOutput);cout<<endl;copy(strMyList1.begin(),strMyList1.end(),strOutput);cout<<endl;//各個list類型的迭代子被賦值nItBegin1=nMyList1.begin();dblItBegin1=dblMyList1.begin();cItBegin1=cMyList1.begin();strItBegin1=strMyList1.begin();ptItBegin1=ptMyList1.begin();nItEnd1=nMyList1.end();dblItEnd1=dblMyList1.end();cItEnd1=cMyList1.end();strItEnd1=strMyList1.end();ptItEnd1=ptMyList1.end();//用insert函數(shù)實現(xiàn)兩個list類型對象成員數(shù)據(jù)的復制nMyList2.insert(nMyList2.begin(),nMyList1.begin(),nMyList1.end());dblMyList2.insert(dblMyList2.begin(),dblMyList1.begin(),dblMyList1.end());(續(xù))第38頁,共79頁,2023年,2月20日,星期五cMyList2.insert(cMyList2.begin(),cMyList1.begin(),cMyList1.end());strMyList2.insert(strMyList2.begin(),strMyList1.begin(),strMyList1.end());ptMyList2.insert(ptMyList2.begin(),ptMyList1.begin(),ptMyList1.end());//各個list類型的迭代子被賦值nItBegin2=nMyList2.begin();dblItBegin2=dblMyList2.begin();cItBegin2=cMyList2.begin();strItBegin2=strMyList2.begin();ptItBegin2=ptMyList2.begin();nItEnd2=nMyList2.end();dblItEnd2=dblMyList2.end();cItEnd2=cMyList2.end();strItEnd2=strMyList2.end();ptItEnd2=ptMyList2.end();//用迭代子輸出不同list類型對象的數(shù)據(jù),對于list類型不能對迭代子使用+=/-=等//運算符也不能使用[]進行直接存?。ɡm(xù))第39頁,共79頁,2023年,2月20日,星期五while(nItBegin1!=nItEnd1)//輸出nMyList1{cout<<*nItBegin1<<″″;nItBegin1++;}cout<<endl;while(dblItBegin1!=dblItEnd1)//輸出dblMyList1{cout<<*dblItBegin1<<″″;dblItBegin1++;}cout<<endl;while(cItEnd1!=cItBegin1)//輸出cMyList1{cout<<*(--cItEnd1)<<″″;}cout<<endl;while(strItBegin1!=strItEnd1)//輸出strMyList1(續(xù))第40頁,共79頁,2023年,2月20日,星期五{cout<<*strItBegin1<<″″;strItBegin1++;}cout<<endl;while(ptItBegin1!=ptItEnd1)//輸出ptMyList1{intstaticcount=0;if(count==5){count=0;cout<<endl;}ptItBegin1->display();ptItBegin1++;count++;}cout<<endl;//分別輸出用insert函數(shù)得到的新對象while(nItBegin2!=nItEnd2)//輸出nMyList2 (續(xù))第41頁,共79頁,2023年,2月20日,星期五{cout<<*nItBegin2<<″″;nItBegin2++;}cout<<endl;while(dblItBegin2!=dblItEnd2)//輸出dblMyLIst2{cout<<*dblItBegin2<<″″;dblItBegin2++;}cout<<endl;while(cItEnd2!=cItBegin2)//輸出cMyList2{0cout<<*(--cItEnd2)<<″″;}cout<<endl;while(strItBegin2!=strItEnd2)//輸出strMyList2{ (續(xù))第42頁,共79頁,2023年,2月20日,星期五cout<<*strItBegin2<<″″;strItBegin2++;}cout<<endl;while(ptItBegin2!=ptItEnd2)//輸出ptMyList2{intstaticcount=0;if(count==5){count=0;cout<<endl;}ptItBegin2->display();ptItBegin2++;count++;}cout<<endl;//從字符型list對象中彈出數(shù)據(jù)for(i=0;i<5;i++){ (續(xù))第43頁,共79頁,2023年,2月20日,星期五cItEnd1=cMyList1.end();cout<<″TheElementwillbepopis:″<<*(--cItEnd1)<<endl;cMyList1.popback();}cItEnd1=cMyList1.end();cItBegin1=cMyList1.begin();//輸出彈出數(shù)據(jù)后的字符型list對象的數(shù)據(jù)while(cItBegin1!=cItEnd1){cout<<*cItBegin1<<″″;cItBegin1++;}cout<<endl;nItBegin1=nMyList1.begin();nItEnd1=nMyList1.end();//用一個已經(jīng)存在的list對象初始化另一個list對象list<int>nMyList3(nItBegin1,nItEnd1);list<int>nMyList4(nMyList3);(續(xù))第44頁,共79頁,2023年,2月20日,星期五//輸出兩個新的list對象copy(nMyList3.begin(),nMyList3.end(),nOutput);cout<<endl;copy(nMyList4.begin(),nMyList4.end(),nOutput);cout<<endl;}//源程序結(jié)束123456789100.10.20.30.40.50.60.70.80.91BCDEFGHIJKILikeC++!123456789100.10.20.30.40.50.60.70.80.91BCDEFGHIJKILikeC++!Point(1,1)Point(2,2)Point(3,3)Point(4,4)Point(5,5)Point(6,6)Point(7,7)Point(8,8)Point(9,9)Point(10,10)(續(xù))第45頁,共79頁,2023年,2月20日,星期五123456789100.10.20.30.40.50.60.70.80.91BCDEFGHIJKILikeC++!Point(1,1)Point(2,2)Point(3,3)Point(4,4)Point(5,5)Point(6,6)Point(7,7)Point(8,8)Point(9,9)Point(10,10)TheElementwillbepopis:KTheElementwillbepopis:JTheElementwillbepopis:ITheElementwillbepopis:HTheElementwillbepopis:GBCDEF1234567891012345678910(續(xù))第46頁,共79頁,2023年,2月20日,星期五雙端隊列,支持對數(shù)據(jù)的直接訪問和順序訪問。雙端隊列的基本操作一般用在對象序列的開頭或結(jié)尾頻繁插入或者刪除的情況。//EXAMPLE11_4.CPP//源程序開始#pragmawarning(disable:4786)//防止一個編譯警告的出現(xiàn)#include<iostream>#include<numeric>#include<algorithm>#include<functional>#include<deque>#include<iterator>#include<string>usingnamespacestd;//聲明使用std名稱空間 例11-4雙端隊列應(yīng)用舉例【

11.5雙端隊列】第47頁,共79頁,2023年,2月20日,星期五例11-4classPoint//類Point的聲明及實現(xiàn){private://聲明私有數(shù)據(jù)成員intx;inty;public://聲明對外接口Point(intxx=0,intyy=0)//帶默認形參值的構(gòu)造函數(shù){x=xx;y=yy;}voiddisplay()//顯示函數(shù){cout<<″Point″<<″(″<<x<<″,″<<y<<″)″<<″″;}intgetx()const{returnx;}intgety()const{returny;}booloperator==(constPoint&point2)const;booloperator<(constPoint&point2)const;}; 雙端隊列應(yīng)用舉例第48頁,共79頁,2023年,2月20日,星期五boolPoint::operator==(constPoint&point2)const{if((x==point2.getx())&&(y==point2.gety()))returntrue;elsereturnfalse;}boolPoint::operator<(constPoint&point2)const{if((getx()<point2.getx())&&(gety()<point2.gety()))returntrue;elsereturnfalse;}voidmain(){deque<int>nMyDeque1,//整型雙端隊列 nMyDeque2;deque<double>dblMyDeque1,//雙精度型雙端隊列 dblMyDeque2;deque<char>cMyDeque1,//字符型雙端隊列 cMyDeque2; (續(xù))第49頁,共79頁,2023年,2月20日,星期五deque<string>strMyDeque1,//字符串型雙端隊列 strMyDeque2;deque<Point>ptMyDeque1,//Point型雙端隊列 ptMyDeque2;

//針對不同雙端隊列類型的迭代子deque<int>::iteratornItBegin,nItEnd;deque<double>::iteratordblItBegin,dblItEnd;deque<char>::iteratorcItBegin,cItEnd;deque<string>::iteratorstrItBegin,strItEnd;deque<Point>::iteratorptItBegin,ptItEnd;

//針對不同雙端隊列類型的輸出流迭代子ostreamiterator<int>nOutput(cout,″″);ostreamiterator<double>dblOutput(cout,″″);ostreamiterator<char>cOutput(cout,″″);ostreamiterator<string>strOutput(cout,″″);

//得到各種雙端隊列類型對象中的數(shù)據(jù)for(inti=1;i<=10;i++){nMyDeque1.pushback(i); (續(xù))第50頁,共79頁,2023年,2月20日,星期五dblMyDeque1.pushfront(i/10.0);cMyDeque1.pushback(′A′+i);Point*point=newPoint(i,i);ptMyDeque1.pushback(*point);}strMyDeque1.pushback(″I″);strMyDeque1.pushback(″Like″);strMyDeque1.pushback(″C++!″);

//將不同雙端隊列類型對象中的數(shù)據(jù)輸出到標準輸出流,顯示出來copy(nMyDeque1.begin(),nMyDeque1.end(),nOutput);cout<<endl;copy(dblMyDeque1.begin(),dblMyDeque1.end(),dblOutput);cout<<endl;copy(cMyDeque1.begin(),cMyDeque1.end(),cOutput);cout<<endl;copy(strMyDeque1.begin(),strMyDeque1.end(),strOutput);cout<<endl; (續(xù))第51頁,共79頁,2023年,2月20日,星期五

//各個雙端隊列類型的迭代子被賦值nItBegin=nMyDeque1.begin();dblItBegin=dblMyDeque1.begin();cItBegin=cMyDeque1.begin();strItBegin=strMyDeque1.begin();ptItBegin=ptMyDeque1.begin();nItEnd=nMyDeque1.end();dblItEnd=dblMyDeque1.end();cItEnd=cMyDeque1.end();strItEnd=strMyDeque1.end();ptItEnd=ptMyDeque1.end();

//用insert函數(shù)實現(xiàn)兩個雙端隊列類型對象成員數(shù)據(jù)的復制nMyDeque2.insert(nMyDeque2.begin(),nMyDeque1.begin(),nMyDeque1.end());for(i=0;i<nMyDeque2.size();i++){cout<<nMyDeque2[i]<<″″;}cout<<endl; (續(xù))第52頁,共79頁,2023年,2月20日,星期五dblMyDeque2.insert(dblMyDeque2.begin(),dblMyDeque1.begin(),dblMyDeque1.end());for(i=0;i<dblMyDeque2.size();i++){cout<<dblMyDeque2[i]<<″″;}cout<<endl;cMyDeque2.insert(cMyDeque2.begin(),cMyDeque1.begin(),cMyDeque1.end());for(i=0;i<cMyDeque2.size();i++){cout<<cMyDeque2[i]<<″″;}cout<<endl;strMyDeque2.insert(strMyDeque2.begin(),strMyDeque1.begin(),strMyDeque1.end());for(i=0;i<strMyDeque2.size();i++){cout<<strMyDeque2[i]<<″″;}cout<<endl; (續(xù))第53頁,共79頁,2023年,2月20日,星期五ptMyDeque2.insert(ptMyDeque2.begin(),ptMyDeque1.begin(),ptMyDeque1.end());for(i=0;i<ptMyDeque2.size();i++){intstaticcount=0;if(count==5){count=0;cout<<endl;}ptMyDeque2[i].display();count++;}cout<<endl;

//用迭代子輸出不同雙端隊列類型對象的數(shù)據(jù)while(nItBegin!=nItEnd){cout<<*nItBegin<<″″;nItBegin++;}cout<<endl; (續(xù))第54頁,共79頁,2023年,2月20日,星期五while(dblItBegin!=dblItEnd){cout<<*dblItBegin<<″″;dblItBegin+=2;}cout<<endl;while(cItEnd!=cItBegin){cout<<*(--cItEnd)<<″″;}cout<<endl;while(strItBegin!=strItEnd){cout<<*strItBegin<<″″;strItBegin++;}cout<<endl;while(ptItBegin!=ptItEnd){ (續(xù))第55頁,共79頁,2023年,2月20日,星期五intstaticcount=0;if(count==5){count=0;cout<<endl;}ptItBegin->display();ptItBegin++;count++;}cout<<endl;

//用標準算法得到整型雙端隊列對象中所有數(shù)據(jù)的和cout<<″ThesumofnMyDeque1[i]is:″ <<accumulate(nMyDeque1.begin(),nMyDeque1.end(),0.0f) <<endl;

//用標準算法得到雙精度型雙端隊列對象中所有數(shù)據(jù)的積cout<<″ThemultipliesofdblMyDeque1[i]is:″<<accumulate(dblMyDeque1.begin(),dblMyDeque1.end(),1.0f,multiplies<double>())<<endl;

(續(xù))第56頁,共79頁,2023年,2月20日,星期五

//從字符型雙端隊列對象中彈出數(shù)據(jù)for(i=0;i<5;i++){cItEnd=cMyDeque1.end();cout<<″TheElementwillbepopis:″<<*(--cItEnd)<<endl;cMyDeque1.popback();}cItEnd=cMyDeque1.end();cItBegin=cMyDeque1.begin();

//輸出彈出數(shù)據(jù)后的字符型雙端隊列對象的數(shù)據(jù)while(cItBegin!=cItEnd){cout<<*cItBegin<<″″;cItBegin++;}cout<<endl;nItBegin=nMyDeque1.begin();nItEnd=nMyDeque1.end(); (續(xù))第57頁,共79頁,2023年,2月20日,星期五//用一個已經(jīng)存在的雙端隊列對象初始化另一個雙端隊列對象deque<int>nMyDeque3(nItBegin,nItEnd);deque<int>nMyDeque4(nMyDeque3);//輸出兩個新

溫馨提示

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

評論

0/150

提交評論