版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
向量Vector使用方法詳解vector(向量):作為一種數(shù)據(jù)結(jié)構(gòu),確切的說(shuō)是一個(gè)類?它相當(dāng)于一個(gè)動(dòng)態(tài)的數(shù)組,當(dāng)程序員無(wú)法知道自己需要的數(shù)組的規(guī)模多大時(shí),用其來(lái)解決問題可以達(dá)到最大節(jié)約空間的目的.一、C/C++中Vector用法:C++中vector(向量):作為一種數(shù)據(jù)結(jié)構(gòu),確切的說(shuō)是一個(gè)類?它相當(dāng)于一個(gè)動(dòng)態(tài)的數(shù)組。1、用法:文件包含:首先在程序開頭處加上#include<vector>以包含所需要的類文件vector,還有一定要加上usingnamespacestd;變量聲明:2.1例:聲明一個(gè)int向量以替代一維的數(shù)組:vector<int>a;(等于聲明了一個(gè)int數(shù)組a[],大小沒有指定,可以動(dòng)態(tài)的向里面添加刪除元素。2.2例:用vector代替二維數(shù)組?其實(shí)只要聲明一個(gè)一維數(shù)組向量即可,而一個(gè)數(shù)組的名字其實(shí)代表的是它的首地址,所以只要聲明一個(gè)地址的向量即可,即:vector<int*>a;同理想用向量代替三維數(shù)組也是一樣,vector<int**>a;再往上面依此類推.具體的用法以及函數(shù)調(diào)用:3.1如何得到向量中的元素?其用法和數(shù)組一樣:例如:vector<int*>a;intb=5;a.push_back(b);〃該函數(shù)下面有詳解cout<<a[0]; //輸出結(jié)果為5Vector各類常用函數(shù)解釋:push_back 在數(shù)組的最后添加一個(gè)數(shù)據(jù)pop_back 去掉數(shù)組的最后一個(gè)數(shù)據(jù)at 得到編號(hào)位置的數(shù)據(jù)begin 得到數(shù)組頭的指針end 得到數(shù)組的最后一個(gè)單元+1的指針6.front 得到數(shù)組頭的引用back 得到數(shù)組的最后一個(gè)單元的引用max_size 得到vector最大可以是多大capacity 當(dāng)前vector分配的大小size 當(dāng)前使用數(shù)據(jù)的大小resize 改變當(dāng)前使用數(shù)據(jù)的大小,如果它比當(dāng)前使用的大,者填充默認(rèn)值reserve 改變當(dāng)前vecotr所分配空間的大小erase 刪除指針指向的數(shù)據(jù)項(xiàng)clear 清空當(dāng)前的vector15.rbegin 將vector反轉(zhuǎn)后的開始指針返回(其實(shí)就是原來(lái)的end-1)16.rend 將vector反轉(zhuǎn)構(gòu)的結(jié)束指針返回(其實(shí)就是原來(lái)的begin-1)17.empty 判斷vector是否為空18.swap與另一個(gè)vector交換數(shù)據(jù)3.2詳細(xì)的函數(shù)實(shí)現(xiàn)功能:其中vector<int>c.c.clear() 移除容器中所有數(shù)據(jù)。c.empty()判斷容器是否為空。c.erase(pos)刪除pos位置的數(shù)據(jù)c.erase(beg,end)刪除[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è)元素的迭代器4.內(nèi)存管理與效率1》使用reserve()函數(shù)提前設(shè)定容量大小,避免多次容量擴(kuò)充操作導(dǎo)致效率低下。關(guān)于STL容器,最令人稱贊的特性之一就是是只要不超過(guò)它們的最大大小,它們就可以自動(dòng)增長(zhǎng)到足以容納你放進(jìn)去的數(shù)據(jù)。(要知道這個(gè)最大值,只要調(diào)用名叫max_size的成員函數(shù)。)對(duì)于vector和string,如果需要更多空間,就以類似realloc的思想來(lái)增長(zhǎng)大小。vector容器支持隨機(jī)訪問,因此為了提高效率,它內(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等增加元素的操作時(shí),如果此時(shí)動(dòng)態(tài)數(shù)組的內(nèi)存不夠用,就要?jiǎng)討B(tài)的重新分配當(dāng)前大小的1.5~2倍的新內(nèi)存區(qū),再把原數(shù)組的內(nèi)容復(fù)制過(guò)去(所以,在一般情況下,其訪問速度同一般數(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ù),因而可以避免真分配的開銷和迭代器/指針/引用失效(但在我解釋reserve為什么可以那么做之前,讓我簡(jiǎn)要介紹有時(shí)候令人困惑的四個(gè)相關(guān)成員函數(shù)。在標(biāo)準(zhǔn)容器中,只有vector和string提供了所有這些函數(shù)((1)size()告訴你容器中有多少元素(它沒有告訴你容器為它容納的元素分配了多少內(nèi)存。⑵capacity。告訴你容器在它已經(jīng)分配的內(nèi)存中可以容納多少元素(那是容器在那塊內(nèi)存中總共可以容納多少元素,而不是還可以容納多少元素。如果你想知道一個(gè)vector或string中有多少?zèng)]有被占用的內(nèi)存,你必須從capacity()中減去size()(如果size和capacity返回同樣的值,容器中就沒有剩余空間了,而下一次插入(通過(guò)insert或push_back等)會(huì)引發(fā)上面的重新分配步驟(⑶resize(Container::size_typen)強(qiáng)制把容器改為容納n個(gè)元素。調(diào)用resize之后,size將會(huì)返回n。如果n小于當(dāng)前大小,容器尾部的元素會(huì)被銷毀。如果n大于當(dāng)前大小,新默認(rèn)構(gòu)造的元素會(huì)添加到容器尾部。如果n大于當(dāng)前容量,在元素加入之前會(huì)發(fā)生重新分配。⑷reserve(Container::size_typen)強(qiáng)制容器把它的容量改為至少n,提供的n不小于當(dāng)前大小。這一般強(qiáng)迫進(jìn)行一次重新分配,因?yàn)槿萘啃枰黾印?如果n小于當(dāng)前容量,vector忽略它,這個(gè)調(diào)用什么都不做,string可能把它的容量減少為size()和n中大的數(shù),但string的大小沒有改變。在我的經(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值的vector<int>。沒有使用reserve,你可以像這樣來(lái)做:vector<int>v;for(inti=1;i<=1000;++i)v.push_back(i);在大多數(shù)STL實(shí)現(xiàn)中,這段代碼在循環(huán)過(guò)程中將會(huì)導(dǎo)致2到10次重新分配。(10這個(gè)數(shù)沒什么奇怪的。記住vector在重新分配發(fā)生時(shí)一般把容量翻倍,而1000約等于210。)把代碼改為使用reserve,我們得到這個(gè):vector<int>v;v.reserve(1000);for(inti=1;i<=1000;++i)v.push_back(i);這在循環(huán)中不會(huì)發(fā)生重新分配。在大小和容量之間的關(guān)系讓我們可以預(yù)言什么時(shí)候插入將引起vector或string執(zhí)行重新分配,而且,可以預(yù)言什么時(shí)候插入會(huì)使指向容器中的迭代器、指針和引用失效。例如,給出這段代碼,strings;if(s.size()<s.capacity()){s.push_back('x');}push_back的調(diào)用不會(huì)使指向這個(gè)string中的迭代器、指針或引用失效,因?yàn)閟tring的容量保證大于它的大小。如果不是執(zhí)行push_back,代碼在string的任意位置進(jìn)行一個(gè)insert,我們?nèi)匀豢梢员WC在插入期間沒有發(fā)生重新分配,但是,與伴隨string插入時(shí)迭代器失效的一般規(guī)則一致,所有從插入位置到string結(jié)尾的迭代器/指針/引用將失效?;氐奖緱l款的主旨,通常有兩情況使用reserve來(lái)避免不必要的重新分配。第一個(gè)可用的情況是當(dāng)你確切或者大約知道有多少元素將最后出現(xiàn)在容器中。那樣的話,就像上面的vector代碼,你只是提前reserve適當(dāng)數(shù)量的空間。第二種情況是保留你可能需要的最大的空間,然后,一旦你添加完全部數(shù)據(jù),修整掉任何多余的容量。2》使用“交換技巧”來(lái)修整vector過(guò)??臻g/內(nèi)存有一種方法來(lái)把它從曾經(jīng)最大的容量減少到它現(xiàn)在需要的容量。這樣減少容量的方法常常被稱為“收縮到合適(shrinktofit)”。該方法只需一條語(yǔ)句:vector<int>(ivec).swap(ivec);表達(dá)式vector<int>(ivec健立一個(gè)臨時(shí)vector,它是ivec的一份拷貝:vector的拷貝構(gòu)造函數(shù)做了這個(gè)工作。但是,vector的拷貝構(gòu)造函數(shù)只分配拷貝的元素需要的內(nèi)存,所以這個(gè)臨時(shí)vector沒有多余的容量。然后我們讓臨時(shí)vector和ivec交換數(shù)據(jù),這時(shí)我們完成了,ivec只有臨時(shí)變量的修整過(guò)的容量,而這個(gè)臨時(shí)變量則持有了曾經(jīng)在ivec中的沒用到的過(guò)剩容量。在這里(這個(gè)語(yǔ)句結(jié)尾),臨時(shí)vector被銷毀,因此釋放了以前ivec使用的內(nèi)存,收縮到合適。3》用swap方法強(qiáng)行釋放STLVector所占內(nèi)存template<classT>voidClearVector(vector<T>&v){vector<T>vtTemp;vtTemp.swap(v);}如vector<int>v;nums.push_back(1);nums.push_back(3);nums.push_back(2);nums.push_back(4);vector<int>().swap(v);/*或者v.swap(vector<int>());*//*或者{std::vector<int>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è)試代碼如下:#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>iVec;cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//1個(gè)元素,容器容量為1iVec.push_back(1);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//2個(gè)元素,容器容量為2iVec.push_back(2);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//3個(gè)元素,容器容量為4iVec.push_back(3);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//4個(gè)元素,容器容量為4iVec.push_back(4);iVec.push_back(5);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//5個(gè)元素,容器容量為8iVec.push_back(6);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//6個(gè)元素,容器容量為8iVec.push_back(7);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//7個(gè)元素,容器容量為8iVec.push_back(8);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//8個(gè)元素,容器容量為8iVec.push_back(9);cout<<"容器大小為:"<<iVec.size()<<endl;cout<<"容器容量為:"<<iVec.capacity()<<endl;//9個(gè)元素,容器容量為16/*vs2005/8容量增長(zhǎng)不是翻倍的,如9個(gè)元素容量910個(gè)元素容量13*//*測(cè)試effectivestl中的特殊的交換swap()*/cout<<"當(dāng)前vector的大小為:"<<iVec.size()<<endl;cout<<"當(dāng)前vector的容量為:"<<iVec.capacity()<<endl;vector<int>(iVec).swap(iVec);cout<<"臨時(shí)的vector<int>對(duì)象的大小為:"<<(vector<int>(iVec)).size()<<endl;cout<<"臨時(shí)的vector<int>對(duì)象的容量為:"<<(vector<int>(iVec)).capacity()<<endl;cout<<"交換后,當(dāng)前vector的大小為:"<<iVec.size()<<endl;cout<<"交換后,當(dāng)前vector的容量為:"<<iVec.capacity()<<endl;return0;}vector的其他成員函數(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_range。c.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<Elem>():銷毀所有數(shù)據(jù),釋放內(nèi)存。備注:在用vector的過(guò)程中的一些問題特此列出討論:1)vector<int>a;intb=5;a.push_back(b);此時(shí)若對(duì)b另外賦值時(shí)不會(huì)影響a[0]的值2)vector<int*>a;int*b;b=newint[4];b[0]=0;b[1]=1;b[2]=2;a.push_back(b);deleteb; //釋放b的地址空間for(inti=0;i<3;i++){cout<<a[0][i]<<endl;}此時(shí)輸出的值并不是一開始b數(shù)組初始化的值,而是一些無(wú)法預(yù)計(jì)的值.分析:根據(jù)1)2)的結(jié)果,可以想到,在1)中,往a向量中壓入的是b的值,即a[O]=b,此時(shí)a[0]和b是存儲(chǔ)在兩個(gè)不同的地址中的?因此改變b的值不會(huì)影響a[0];而在2)中,因?yàn)槭前岩粋€(gè)地址(指針)壓入向量a,即a[O]=b,因此釋放了b的地址也就釋放了a[0]的地址,因此a[0]數(shù)組中存放的數(shù)值也就不得而知了.二、JAVA中Vector用法:Java中Vector和ArrayList的區(qū)別:首先看這兩類都實(shí)現(xiàn)List接口,而List接口一共有三個(gè)實(shí)現(xiàn)類,分別是ArrayList、Vector和LinkedList。List用于存放多個(gè)元素,能夠維護(hù)元素的次序,并且允許元素的重復(fù)。3個(gè)具體實(shí)現(xiàn)類的相關(guān)區(qū)別如下:ArrayList是最常用的List實(shí)現(xiàn)類,內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)的,它允許對(duì)元素進(jìn)行快速隨機(jī)訪問。數(shù)組的缺點(diǎn)是每個(gè)元素之間不能有間隔,當(dāng)數(shù)組大小不滿足時(shí)需要增加存儲(chǔ)能力,就要講已經(jīng)有數(shù)組的數(shù)據(jù)復(fù)制到新的存儲(chǔ)空間中。當(dāng)從ArrayList的中間位置插入或者刪除元素時(shí),需要對(duì)數(shù)組進(jìn)行復(fù)制、移動(dòng)、代價(jià)比較高。因此,它適合隨機(jī)查找和遍歷,不適合插入和刪除。Vector與ArrayList一樣,也是通過(guò)數(shù)組實(shí)現(xiàn)的,不同的是它支持線程的同步,即某一時(shí)刻只有一個(gè)線程能夠?qū)慥ector,避免多線程同時(shí)寫而引起的不一致性,但實(shí)現(xiàn)同步需要很高的花費(fèi),因此,訪問它比訪問ArrayList慢。LinkedList是用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的,很適合數(shù)據(jù)的動(dòng)態(tài)插入和刪除,隨機(jī)訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當(dāng)作堆棧、隊(duì)列和雙向隊(duì)列使用。查看Java源代碼,發(fā)現(xiàn)當(dāng)數(shù)組的大小不夠的時(shí)候,需要重新建立數(shù)組,然后將元素拷貝到新的數(shù)組內(nèi),ArrayList和Vector的擴(kuò)展數(shù)組的大小不同。ArrayList中:publicbooleanadd(Ee){ensureCapacity(size+1);//增加元素,判斷是否能夠容納。不能的話就要新建數(shù)組elementData[size++]=e;returntrue;}publicvoidensureCapacity(intminCapacity){modCount++;intoldCapacity=elementData.length;if(m
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)模塊化多路船用滅火報(bào)警項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國(guó)柴油機(jī)齒輪胚產(chǎn)業(yè)未來(lái)發(fā)展趨勢(shì)及投資策略分析報(bào)告
- 2024-2030年中國(guó)條碼機(jī)市場(chǎng)運(yùn)行狀況及投資發(fā)展前景預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)月餅行業(yè)營(yíng)銷模式及投資競(jìng)爭(zhēng)力研究報(bào)告
- 2024-2030年中國(guó)智能廚房秤市場(chǎng)營(yíng)銷態(tài)勢(shì)與銷售效益預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)無(wú)鹵磷酸酯阻燃劑行業(yè)需求動(dòng)態(tài)與投資前景預(yù)測(cè)報(bào)告
- 敦煌課程設(shè)計(jì)理念
- 九年級(jí)下學(xué)期班主任工作計(jì)劃
- 學(xué)學(xué)生食糖工程課程設(shè)計(jì)
- 托爾斯泰課程設(shè)計(jì)意圖
- 工程建設(shè)監(jiān)理收費(fèi)標(biāo)準(zhǔn)(發(fā)改價(jià)格【2007】670號(hào))
- 摩托車品牌文化營(yíng)銷與品牌故事的構(gòu)建
- 2024江蘇南京大數(shù)據(jù)集團(tuán)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- FZT 73032-2017 針織牛仔服裝
- 企業(yè)并購(gòu)與資產(chǎn)重組智慧樹知到期末考試答案2024年
- 貨物包裝承諾函
- 治療用碘131I化鈉膠囊-臨床用藥解讀
- 2024人教版五年級(jí)上冊(cè)數(shù)學(xué)期末口算題訓(xùn)練
- 2024外研版初中英語(yǔ)單詞表匯總(七-九年級(jí))中考復(fù)習(xí)必背
- 安徽省合肥市包河區(qū)2023-2024學(xué)年三年級(jí)上學(xué)期期末英語(yǔ)試卷
- 勞動(dòng)爭(zhēng)議調(diào)解仲裁法
評(píng)論
0/150
提交評(píng)論