




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
0STL中的線性容器vector的使用學(xué)習(xí)重點(diǎn):vector中的函數(shù)vector中的異常處理學(xué)習(xí)目標(biāo):熟練的掌握vector中的函數(shù)的使用方法了解vector的異常處理機(jī)制。1vector模擬出一個(gè)動(dòng)態(tài)數(shù)組。因此,它本身是將元素添加到動(dòng)態(tài)數(shù)組中加以管理的一個(gè)抽象概念。C++Standard并未要求必須以動(dòng)態(tài)數(shù)組來(lái)實(shí)現(xiàn)vector,只是規(guī)定了相應(yīng)條件和操作復(fù)雜度。5STL中的線性容器5.1:vector容器2使用vector之前,必須包含頭文件<vector>#include<vector>類型vector是一個(gè)定義于namespacestd內(nèi)的template:namespacestd{ template<typenameT,typenameAllocator=allocator<T>> classvector;}vector的元素可以是任意類型T,但必須具備賦值和拷貝兩個(gè)性質(zhì)。第二個(gè)template參數(shù),用來(lái)定義內(nèi)存模型。5STL中的線性容器5.1:vector容器3vector將其元素復(fù)制到內(nèi)部的動(dòng)態(tài)數(shù)組中。元素之間總是存在某種順序,所以vector是一種有序群集。vector支持隨機(jī)存取,因此只要知道位置,可以在常數(shù)時(shí)間內(nèi)存取任何一個(gè)元素。vector的迭代器是隨機(jī)存取迭代器,所以對(duì)任何一個(gè)STL算法都可以奏效。在末端附加或刪除元素時(shí),vector的性能相當(dāng)好。前端或中部插入或刪除元素,性能就比較差。因?yàn)閯?dòng)作點(diǎn)之后的每一個(gè)元素都必須移到另一個(gè)位置,而每一次移動(dòng)都得調(diào)用賦值操作符。5STL中的線性容器5.1:vector容器4vector之中用于操作大小的函數(shù)有size()、empty()、max_size()。另一個(gè)與大小有關(guān)的函數(shù)是capacity(),返回vector實(shí)際能夠容納的元素?cái)?shù)量。如果超過這個(gè)數(shù)量,vector就有必要重新分配內(nèi)存。vector的容量之所以很重要,有以下兩個(gè)原因:1)一旦內(nèi)存重新分配,和vector元素相關(guān)的所有引用、指針、迭代器都會(huì)失效。2)內(nèi)存重新分配很耗時(shí)間。5STL中的線性容器5.1:vector容器5可以使用reserve()保留適當(dāng)容量,避免一再重新分配內(nèi)存。std::vector<int>v;//創(chuàng)建空的vectorv.reserve(80); //產(chǎn)生80個(gè)存儲(chǔ)單元縮減容量的方法,用兩個(gè)vector交換內(nèi)容,這樣兩個(gè)vector的容量也會(huì)互換。另一種避免重新分配內(nèi)存的方法是,初始化期間就向構(gòu)造函數(shù)傳遞附加參數(shù),建構(gòu)出足夠的空間。如果參數(shù)是個(gè)數(shù)值,它將成為vector的起始大小。std::vector<T>v(5);//創(chuàng)建vector同時(shí)確定vector的容量5STL中的線性容器5.1:vector容器6構(gòu)造函數(shù)、拷貝和析構(gòu)函數(shù)函數(shù)功能vector<Elem>c產(chǎn)生一個(gè)空vector,其中沒有任何元素vector<Elem>c1(c2)產(chǎn)生另一個(gè)同類型vector的副本(所有元素都被拷貝)vector<Elem>c(n)利用元素的默認(rèn)構(gòu)造函數(shù)生成一個(gè)大小為n的vectorvector<Elem>c(n,elem)產(chǎn)生一個(gè)大小為n的vector,每個(gè)元素值都是elemvector<Elem>c(beg,end)產(chǎn)生一個(gè)vector,以區(qū)間[beg;end)做為元素初值c.~vector<Elem>()銷毀所有元素,并釋放內(nèi)存5STL中的線性容器5.1:vector容器7 vector<int>vContainers1;//定義空vector for(intindex=0;index<10;index++) { vContainers1.push_back(index); }為空vector賦值:用vContainers1產(chǎn)生vContainers2 vector<int>vContainers2(vContainers1);利用元素的默認(rèn)構(gòu)造函數(shù)生成一個(gè)大小為10的vector vector<int> vContainers3(10);5STL中的線性容器5.1:vector容器8 vector<int>vContainers4(10,-1);產(chǎn)生大小為10,每個(gè)元素值為-1的容器產(chǎn)生一個(gè)vector,以區(qū)間[beg;end)做為元素初值 intiarray[5]={1,2,3,4,5}; vector<int>vContainers5(iarray,&iarray[5]);5STL中的線性容器5.1:vector容器9非變動(dòng)性操作函數(shù)功能c.size()返回當(dāng)前的元素?cái)?shù)量c.empty()判斷大小是否為零。等同于size()==0c.max_size()返回可容納的元素最大數(shù)量capacity()返回重新分配空間前所能容納的元素最大數(shù)量reserve()如果容量不足,擴(kuò)大容量c1==c2判斷c1是否等于c2c1!=c2判斷c1是否不等于c2,等同于!(c1==c2)c1<c2判斷c1是否小于c2c1<=c2判斷c1是否小于等于c2,等同于!(c2<c1)c1>=c2判斷c1是否大于等于c2,等同于!(c1<c2)5STL中的線性容器5.1:vector容器10vector的容量操作:vector<int>vContainers1;for(intindex=0;index<10;index++){ vContainers1.push_back(index);}返回當(dāng)前的元素?cái)?shù)量:cout<<"vContainers1中含有"<<vContainers1.size() <<"元素"<<endl;判斷vector大小是否為空:cout<<(vContainers1.empty()?"vContainers1容器為空\(chéng)n": "vContainers1容器不為空\(chéng)n");5STL中的線性容器5.1:vector容器11cout<<"vContainers1容器的最大容量為:"<< vContainers1.max_size()<<endl;cout<<"vContainers1容器在重新分配空間前所能容納的元素最大
數(shù)量為:"<<vContainers1.capacity()<<endl;返回可容納的元素最大數(shù)量:返回重新分配空間前所能容納的元素最大數(shù)量:擴(kuò)大vContainers3容量vector<int>vContainers3(3);cout<<"擴(kuò)充之前:"<<vContainers3.capacity()<<endl;vContainers3.reserve(6);cout<<“擴(kuò)充之后:"<< vContainers3.capacity()<<endl;5STL中的線性容器5.1:vector容器12vector關(guān)系操作:vector<int>vContainers1;for(intindex=0;index<10;index++){ vContainers1.push_back(index);
}vector<int>vContainers2(5);for(intindex=0;index<vContainers2.size();index++){ vContainers2[index]=index; }判斷vContainers1是否等于vContainers2cout<<((vContainers1==vContainers2)?"vContainers1== vContainers2":"vContainers1!=vContainers2")<<endl;5STL中的線性容器5.1:vector容器13判斷vContainers1是否不等于vContainers2cout<<((vContainers1!=vContainers2)?"vContainers1!= vContainers2":"vContainers1==vContainers2")<<endl;判斷vContainers1是否小于vContainers2cout<<((vContainers1<vContainers2)?"vContainers1< vContainers2":"vContainers1>vContainers2")<<endl;判斷vContainers1是否大于等于vContainers2cout<<((vContainers1>=vContainers2)?"vContainers1>= vContainers2":"vContainers1<=vContainers2")<<endl;5STL中的線性容器5.1:vector容器14賦值操作函數(shù)函數(shù)功能c1=c2將c2的全部元素賦值給c1c.assign(n,elem)復(fù)制n個(gè)elem,賦值給cc.assign(beg,end)將區(qū)間[beg;end)內(nèi)的元素賦值給cc1.swap(c2)將c1和c2元素互換swap(c1,c2)同上。此為全局函數(shù)所有賦值操作都可能會(huì)調(diào)用元素類型的默認(rèn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值操作符和(或)析構(gòu)函數(shù),視元素?cái)?shù)量的變化而定。5STL中的線性容器5.1:vector容器15vector賦值操作:vector<int>vContainers1,vContainers2;for(intindex=0;index<10;index++){ vContainers1.push_back(index); }將vContainers1的全部元素賦值給vContainers2:vContainers2=vContainers1;將3個(gè)0,賦值給vContainers2vContainers2.assign(3,0);5STL中的線性容器5.1:vector容器16將vContainers1和vContainers2元素互換vContainers1.swap(vContainers2);全局函數(shù)swap()將vContainers1和vContainers2元素互換std::swap(vContainers1,vContainers2);將區(qū)間[beg;end)內(nèi)的元素賦值給vContainers2intiarray[5]={1,2,3,4,5};vContainers2.assign(iarray,&iarray[5]);5STL中的線性容器5.1:vector容器17元素存取直接用來(lái)存取vector元素的各項(xiàng)操作函數(shù):函數(shù)功能c.at(idx)返回索引idx所標(biāo)示的元素。如果idx越界,拋出out_of_range異常c[idx]返回索引idx所標(biāo)示的元素,不進(jìn)行范圍檢查c.front()返回第一個(gè)元素,不檢查第一個(gè)元素是否存在c.back()返回最后一個(gè)元素,不檢查最后一個(gè)元素是否存在5STL中的線性容器5.1:vector容器18只有at()會(huì)進(jìn)行范圍檢查。如果索引越界,at()會(huì)拋出一個(gè)out_of_range異常。其他函數(shù)都不作檢查。如果發(fā)生越界錯(cuò)誤,會(huì)引發(fā)未定義行為。對(duì)著一個(gè)空vector調(diào)用operator[],front(),back(),都會(huì)引發(fā)未定義行為。調(diào)用operator[]時(shí),必須確定索引有效;調(diào)用front()或back()時(shí)必須確定容器不為空:std::vector<Elem>coll; //vector為空if(coll.size()>5){coll[5]=elem;} //正確if(!coll.empty()){cout<<coll.front();} //正確coll.at(5)=elem; //拋出out_of_range異常5STL中的線性容器5.1:vector容器19vector<int>vContainers1;for(intindex=0;index<10;index++){ vContainers1.push_back(index);}直接用來(lái)存取vectors元素的各項(xiàng)操作通過at()獲取vector中的元素cout<<"vContainers1.at(3):"<<vContainers1.at(3)<<endl;通過[]獲取vector中的元素cout<<"vContainers1[3]:"<<vContainers1[3]<<endl;5STL中的線性容器5.1:vector容器20返回vContainers1容器中第一個(gè)元素cout<<"vContainers1容器中第一個(gè)元素為:" <<vContainers1.front()<<endl;返回vContainers1容器中最后一個(gè)元素cout<<"vContainers1容器中最后一個(gè)元素為:" <<vContainers1.back()<<endl;5STL中的線性容器5.1:vector容器21vector的迭代器相關(guān)函數(shù)函數(shù)功能c.begin()返回一個(gè)隨機(jī)存取迭代器,指向第一個(gè)元素c.end()返回一個(gè)隨機(jī)存取迭代器,指向最后元素的下一個(gè)位置c.rbegin()返回一個(gè)逆向迭代器,指向逆向迭代器的第一個(gè)元素c.rend()返回一個(gè)逆向迭代器,指向逆向迭代器的最后元素的下一個(gè)位置5STL中的線性容器5.1:vector容器22vector迭代器是隨機(jī)存取迭代器。對(duì)vector來(lái)說(shuō),通常就是普通指針。普通指針就是隨機(jī)存取迭代器,而vector內(nèi)部結(jié)構(gòu)通常也就是一個(gè)數(shù)組,所以指針行為可以適用。vector迭代器持續(xù)有效,除非發(fā)生兩種情況:
1)用戶在一個(gè)較小索引位置上插入或刪除元素。2)由于容量變化而引起內(nèi)存重新分配。5STL中的線性容器5.1:vector容器23vector的迭代器相關(guān)操作:vector<int>vContainers;for(intindex=0;index<10;index++){ vContainers.push_back(index);
}定義迭代器vector<int>::iteratorbegin=vContainers.begin(),end=vContainers.end();for(;begin!=end;begin++) cout<<*begin<<'';定義逆向迭代器vector<int>::reverse_iteratorrbegin=vContainers.rbegin(), rend=vContainers.rend();for(;rbegin!=rend;rbegin++) cout<<*rbegin<<'';5STL中的線性容器5.1:vector容器24插入和刪除操作vector的插入、刪除相關(guān)操作函數(shù)函數(shù)功能c.insert(pos,elem)在pos位置上插入一個(gè)elem副本,并返回新元素位置c.insert(pos,n,elem)在pos位置上插入n個(gè)elem副本,無(wú)返回值c.insert(pos,beg,end)在pos位置上插入?yún)^(qū)間[beg;end)內(nèi)的所有元素的副本,無(wú)返回值c.push_back(elem)在尾部添加一個(gè)elem副本c.pop_back()刪除最后一個(gè)元素(但不返回刪除的元素)5STL中的線性容器5.1:vector容器25c.erase(pos)刪除pos位置上的元素,返回下一個(gè)元素的位置c.erase(beg,end)刪除[beg,end)區(qū)間內(nèi)的所有元素,返回下一個(gè)元素的位置c.resize(num)將元素?cái)?shù)量改為num(如果size()變大了,多出來(lái)的新元素都需以默認(rèn)構(gòu)造函數(shù)構(gòu)造完成)c.resize(num,elem)將元素?cái)?shù)量改為num(如果size()變大了,多出來(lái)的新元素都是elem的副本)c.clear()刪除所有元素,將容器清空5STL中的線性容器5.1:vector容器26vector的插入、刪除操作vector<int>vContainers;
vContainers.push_back(1);vContainers.push_back(2);vContainers.push_back(3);在pos位置上插入一個(gè)元素,并返回新元素位置vector<int>::iteratorpos=vContainers.begin();vContainers.insert(pos,0);在pos位置上插入5個(gè)-1。無(wú)返回值pos=vContainers.end()-3;vContainers.insert(pos,5,-1);5STL中的線性容器5.1:vector容器27在pos位置上插入?yún)^(qū)間[beg;end)內(nèi)的所有元素的副本。無(wú)返回值intiarray[3]={4,5,6};pos=vContainers.end()--;vContainers.insert(pos,iarray,&iarray[3]);從vContainers中刪除元素vContainers.pop_back();刪除pos位置上的元素,返回下一元素的位置pos=vContainers.begin()+5;pos=vContainers.erase(pos);5STL中的線性容器5.1:vector容器28刪除[beg,end)區(qū)間內(nèi)的所有元素,返回下一元素的位置vector<int>::iteratortemp=vContainers.begin()+5;pos=vContainers.begin()+1;pos=vContainers.erase(pos,temp);將元素?cái)?shù)量改為7(如果size()變大了,多出來(lái)的新元素都需以默認(rèn)構(gòu)造函數(shù)vContainers.resize(7);將元素?cái)?shù)量改為num
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)活性炭濾布數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)松針條數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 了解窄軌鐵路道岔系列總體設(shè)計(jì)
- 2025至2030年中國(guó)搪缸砂條數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)抗靜電周轉(zhuǎn)箱數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)工作卡數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)奶精粉數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)塑料衣夾數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)發(fā)熱材料數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)去內(nèi)毛刺直縫焊管數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 化學(xué)計(jì)量學(xué)與化學(xué)分析技術(shù)考核試卷
- 2024關(guān)于深化產(chǎn)業(yè)工人隊(duì)伍建設(shè)改革的建議全文解讀課件
- 探究膜分離技術(shù)在水處理中的應(yīng)用
- 洋流課件2024-2025學(xué)年高中地理人教版(2019)選擇性必修一
- 2024-2025學(xué)年中職數(shù)學(xué)拓展模塊一 (下冊(cè))高教版(2021·十四五)教學(xué)設(shè)計(jì)合集
- 電梯維保工程施工組織設(shè)計(jì)方案
- 2024-2030年中國(guó)消防行業(yè)市場(chǎng)發(fā)展分析及發(fā)展趨勢(shì)與投資前景研究報(bào)告
- 外研版(2019) 必修第三冊(cè) Unit 2 Making a Difference教案
- 醫(yī)院科研成果及知識(shí)產(chǎn)權(quán)管理規(guī)范
- DB32T-公路橋梁水下結(jié)構(gòu)檢測(cè)評(píng)定標(biāo)準(zhǔn)
- 高職藥學(xué)專業(yè)《藥物制劑技術(shù)》說(shuō)課課件
評(píng)論
0/150
提交評(píng)論