c++中vector的用法詳解_第1頁(yè)
c++中vector的用法詳解_第2頁(yè)
c++中vector的用法詳解_第3頁(yè)
c++中vector的用法詳解_第4頁(yè)
c++中vector的用法詳解_第5頁(yè)
已閱讀5頁(yè),還剩3頁(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)介

1、c+中vector的用法詳解vector(向量):C+中的一種數(shù)據(jù)結(jié)構(gòu),確切的說(shuō)是一個(gè)類(lèi).它相當(dāng)于一 個(gè)動(dòng)態(tài)的數(shù)組,當(dāng)程序員無(wú)法知道自己需要的數(shù)組的規(guī)模多大時(shí) ,用其 來(lái)解決問(wèn)題可以達(dá)到最大節(jié)約空間的目的.用法:1 .文件包含:首先在程序開(kāi)頭處加上#include以包含所需要的類(lèi)文件vector還有一定要力口上 using namespace std;2 .變量聲明:2.1 例:聲明一個(gè)int向量以替代一維的數(shù)組:vector a;(等于聲明了一 個(gè)int數(shù)組a,大小沒(méi)有指定,可以動(dòng)態(tài)的向里面添加刪除)。2.2 例:用vector代替二維數(shù)組.其實(shí)只要聲明一個(gè)一維數(shù)組向量即可, 而一個(gè)數(shù)組的名

2、字其實(shí)代表的是它的首地址,所以只要聲明一個(gè)地址 的向量即可,即:vector a.同理想用向量代替三維數(shù)組也是一樣,vector a; 再往上面依此類(lèi)推.3 .具體的用法以及函數(shù)調(diào)用:3.1 如何得到向量中的元素?其用法和數(shù)組一樣例如:vector a int b = 5; a.push_back(b);/亥函數(shù)下面有詳解cout1.push_back在數(shù)組的最后添加一個(gè)數(shù)據(jù) 2.pop_back去掉數(shù)組的最后一個(gè)數(shù)據(jù)3.at得到編號(hào)位置的數(shù)據(jù) 4.begin得到數(shù)組頭的指針5.end得到數(shù)組的最后一個(gè)單元+1的指針6. front得到數(shù)組頭的引用7.back得到數(shù)組的最后一個(gè)單元的引用 8.

3、max_size得到vector最 大可以是多大9.capacity當(dāng)前vector分配的大小10.size當(dāng)前使用數(shù)據(jù)的大小11.resize改變當(dāng)前使用數(shù)據(jù)的大小,如果它比當(dāng)前使用的大,者填充默認(rèn)值12.reserve改變當(dāng)前vecotr所分配空間的大小13.erase刪除指針指向的數(shù)據(jù)項(xiàng) 14.clear清空當(dāng)前的vector15.rbegin 將vector反轉(zhuǎn)后的開(kāi)始指針?lè)祷?其實(shí)就是原來(lái)的end-1)16.rend將 vector反轉(zhuǎn)構(gòu)的結(jié)束指針?lè)祷?其實(shí)就是原來(lái)的begin-1)17.empty判 斷vector是否為空18.swap與另一個(gè)vector交換數(shù)據(jù)3.2 詳細(xì)的函數(shù)

4、實(shí)現(xiàn)功能:其中 vector c.c.clear()移除容器中所有數(shù)據(jù)。c.empty()判斷容器是否為空。c.erase(pos刪除pos位置的數(shù)據(jù)c.erase(beg,en刪除beg,end)區(qū)間的數(shù)據(jù)c.front()傳回第一個(gè)數(shù)據(jù)。c.insert(pos,elem在 pos 位置插入一個(gè) elem 拷貝c.pop_back(刪除最后一個(gè)數(shù)據(jù)。c.push_back(elem在尾部加入一個(gè)數(shù)據(jù)。c.resize(num)£新設(shè)置該容器的大小c.size()回容器中實(shí)際數(shù)據(jù)的個(gè)數(shù)。c.begin()返回指向容器第一個(gè)元素的迭代器 c.end()返回指向容器最后一個(gè)元素的迭代器

5、 4.內(nèi)存管理與效率1»使用reserve()函數(shù)提前設(shè)定容量大小,避免多次容量擴(kuò)充操作導(dǎo) 致效率低下。關(guān)于STL容器,最令人稱(chēng)贊的特性之一就是是只要不超過(guò)它們的最 大大小,它們就可以自動(dòng)增長(zhǎng)到足以容納你放進(jìn)去的數(shù)據(jù)。(要知道這個(gè)最大值,只要調(diào)用名叫 max_size的成員函數(shù)。)對(duì)于vector和 string,如果需要更多空間,就以類(lèi)似realloc的思想來(lái)增長(zhǎng)大小。vector 容器支持隨機(jī)訪問(wèn),因此為了提高效率,它內(nèi)部使用動(dòng)態(tài)數(shù)組的方式 實(shí)現(xiàn)的。在通過(guò)reserve()來(lái)申請(qǐng)?zhí)囟ù笮〉臅r(shí)候總是按指數(shù)邊界來(lái) 增大其內(nèi)部緩沖區(qū)。當(dāng)進(jìn)行insert或push_back等增加元素的操

6、作時(shí), 如果此時(shí)動(dòng)態(tài)數(shù)組的內(nèi)存不夠用,就要?jiǎng)討B(tài)的重新分配當(dāng)前大小的 1.52倍的新內(nèi)存區(qū),再把原數(shù)組的內(nèi)容復(fù)制過(guò)去。所以,在一般情 況下,其訪問(wèn)速度同一般數(shù)組,只有在重新分配發(fā)生時(shí),其性能才會(huì) 下降。正如上面的代碼告訴你的那樣。而進(jìn)行pop_back操作時(shí),capacity并不會(huì)因?yàn)関ector容器里的元素減少而有所下降,還會(huì)維持 操作之前的大小。對(duì)于vector容器來(lái)說(shuō),如果有大量的數(shù)據(jù)需要進(jìn)行 push_back,應(yīng)當(dāng)使用reserve()®數(shù)提前設(shè)定其容量大小,否則會(huì)出現(xiàn) 許多次容量擴(kuò)充操作,導(dǎo)致效率低下。reserve成員函數(shù)允許你最小化必須進(jìn)行的重新分配的次數(shù),因而可以 避

7、免真分配的開(kāi)銷(xiāo)和迭代器/指針/引用失效。但在我解釋reserve為什 么可以那么做之前,讓我簡(jiǎn)要介紹有時(shí)候令人困惑的四個(gè)相關(guān)成員函 數(shù)。在標(biāo)準(zhǔn)容器中,只有vector和string提供了所有這些函數(shù)。(1) size()告訴你容器中有多少元素。它沒(méi)有告訴你容器為它容納的元 素分配了多少內(nèi)存。(2) capacity。告訴你容器在它已經(jīng)分配的內(nèi)存中 可以容納多少元素。那是容器在那塊內(nèi)存中總共可以容納多少元素, 而不是還可以容納多少元素。如果你想知道一個(gè)vector或string中有多少?zèng)]有被占用的內(nèi)存,你必須從capacity。中減去size()。如果size和capacity返回同樣的值,容器

8、中就沒(méi)有剩余空間了,而下一次插入(通過(guò)insert或push_back等)會(huì)引發(fā)上面的重新分配步驟。(3)resize(Container:size_type n)強(qiáng)制把容器改為容納n個(gè)元素。調(diào)用resize之后,size將會(huì)返回n。如果n小于當(dāng)前大小,容器尾部的元素 會(huì)被銷(xiāo)毀。如果n大于當(dāng)前大小,新默認(rèn)構(gòu)造的元素會(huì)添加到容器尾 部。如果n大于當(dāng)前容量,在元素加入之前會(huì)發(fā)生重新分配。(4)reserve(Container:size_typen)強(qiáng)制容器把它的容量改為至少 n,提供 的n不小于當(dāng)前大小。這一般強(qiáng)迫進(jìn)行一次重新分配,因?yàn)槿萘啃枰?增加。(如果n小于當(dāng)前容量,vector忽略它,這

9、個(gè)調(diào)用什么都不做, string可能把它的容量減少為size()和n中大的數(shù),但string的大小沒(méi) 有改變。在我的經(jīng)驗(yàn)中,使用 reserve來(lái)從一個(gè)string中修整多余容 量一般不如使用 交換技巧”,那是條款17的主題。) 這個(gè)簡(jiǎn)介表示了只要有元素需要插入而且容器的容量不足時(shí)就會(huì)發(fā) 生重新分配(包括它們維護(hù)的原始內(nèi)存分配和回收, 對(duì)象的拷貝和析 構(gòu)和迭代器、指針和引用的失效)。所以,避免重新分配的關(guān)鍵是使 用reserve盡快把容器的容量設(shè)置為足夠大,最好在容器被構(gòu)造之后 立刻進(jìn)行。例如,假定你想建立一個(gè)容納1-1000值的vectoro沒(méi)有使用reserve 你可以像這樣來(lái)做:vect

10、or v;for (int i = 1; i把代碼改為使用reserve,我們得到這個(gè): vector v;v.reserve(1000);for (int i = 1; i在大小和容量之間的關(guān)系讓我 們可以預(yù)言什么時(shí)候插入將引起 vector或string執(zhí)行重新分配,而且, 可以預(yù)言什么時(shí)候插入會(huì)使指向容器中的迭代器、指針和引用失效。例如,給出這段代碼,string s;.if (s.size()回到本條款的主旨,通常有兩情況使用reserve來(lái) 避免不必要的重新分配。第一個(gè)可用的情況是當(dāng)你確切或者大約知道 有多少元素將最后出現(xiàn)在容器中。那樣的話(huà),就像上面的vector代碼, 你只是提前r

11、eserve適當(dāng)數(shù)量的空間。第二種情況是保留你可能需要 的最大的空間,然后,一旦你添加完全部數(shù)據(jù),修整掉任何多余的容 量。2»使用 交換技巧”來(lái)修整vector過(guò)??臻g/內(nèi)存有一種方法來(lái)把它從曾經(jīng)最大的容量減少到它現(xiàn)在需要的容量。這樣減少容量的方法常常被稱(chēng)為 收縮到合適(shrink to fit) 該方法只 需條語(yǔ)句:vector(ivec).swap(ivec);表達(dá)式vector(ivec)建立個(gè)臨時(shí) vector,它是ivec的一份拷貝:vector的拷貝構(gòu)造函數(shù)做了這個(gè)工作。但是,vector的拷貝構(gòu)造函數(shù)只分配拷貝的元素需要的內(nèi)存,所以這 個(gè)臨時(shí)vector沒(méi)有多余的容量

12、。然后我們讓臨時(shí)vector和ivec交換數(shù) 據(jù),這時(shí)我們完成了,ivec只有臨時(shí)變量的修整過(guò)的容量,而這個(gè)臨 時(shí)變量則持有了曾經(jīng)在ivec中的沒(méi)用到的過(guò)剩容量。在這里(這個(gè) 語(yǔ)句結(jié)尾),臨時(shí)vector被銷(xiāo)毀,因此釋放了以前ivec使用的內(nèi)存, 收縮到合適。3»用swap方法強(qiáng)行釋放STL Vector所占內(nèi)存template void ClearVector( vector vtTemp.swap( v );如 vector v ; nums.push_back(1); nums.push_back(3); nums.push_back(2); nums.push_back(4)

13、; vector().swap(v);/* 或者 v.swap(vector(); */* 或者 std:vector tmp = v; v.swap(tmp); ; / 加大括號(hào) 是讓 tmp 退 出 時(shí)自動(dòng)析構(gòu)*/5 .Vector內(nèi)存管理成員函數(shù)的行為測(cè)試C+ STL的vector使用非常廣泛,但是對(duì)其內(nèi)存的管理模型一直有多種猜測(cè),下面用實(shí)例代碼測(cè)試來(lái)了解其內(nèi)存管理方式,測(cè)試代碼如下:iVec.push_back(1);cout#include #include using namespace std;int main()vector iVec;coutiVec.push_back(2)

14、;coutiVec.push_back(3);coutiVec.push_back(6);coutiVec.push_back(4);iVec.push_back(5);cout iVec.push_back(7);cout iVec.push_back(8);cout iVec.push_back(9);cout/* 測(cè)試 effective stl 中的特殊的交換 swap() */cout (iVec).swap(iVec);cout對(duì)象 的大小為:"(iVec),size()對(duì)象 的容量為:” (iVec).capacity() return 0;6 .vector的其他成員

15、函數(shù)c.assign(beg,end): 將beg; end)區(qū)間中 的數(shù)據(jù)賦值給 c。 c.assign(n,elem)將n個(gè)elem的拷貝賦值給 c。c.at(idx):傳回索引 idx所指的數(shù)據(jù),如果idx越界,拋出out_of_rangec.back():傳回最后一個(gè)數(shù)據(jù),不檢查這個(gè)數(shù)據(jù)是否存在。c.front():傳回地一個(gè)數(shù)據(jù)。get_allocator:使用構(gòu)造函數(shù)返回一個(gè)拷貝。c.rbegin():傳回一個(gè)逆向隊(duì)列的第一個(gè)數(shù)據(jù)。c.rend():傳回一個(gè)逆向隊(duì)列的最后一個(gè)數(shù)據(jù)的下一個(gè)位置。c. vector ():銷(xiāo)毀所有數(shù)據(jù),釋放內(nèi)存。7 .備注:在用vector的過(guò)程中的一些問(wèn)題,特此列出討論:1)vector a;int b = 5;a.push_back(b);此時(shí)若對(duì)b另外賦值時(shí)不會(huì)影響a0的值2)vectora;int*b;b=newint4;b0=0;b1=1;b2

溫馨提示

  • 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)論