关于VECTOR和DEQUE
生活随笔
收集整理的這篇文章主要介紹了
关于VECTOR和DEQUE
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://www.cnblogs.com/ixnehc/archive/2008/09/02/1282356.html
?
?*.先說內(nèi)部結(jié)構(gòu).vector就是一塊連續(xù)的內(nèi)存,這塊連續(xù)的內(nèi)存會(huì)隨著成員的添加而不斷的re-alloc,而且在重分配的時(shí)候,分配的內(nèi)存的大小會(huì) 比實(shí)際需要的多一些,下次再添加成員時(shí),就可以添加在這些多余的空間里,而不會(huì)導(dǎo)致每添加一個(gè)成員就需要重分配內(nèi)存.vector封裝的是一塊連續(xù)的內(nèi) 存,這是我最喜歡它的地方,因?yàn)榭梢园阉某蓡T直接轉(zhuǎn)換成指針來進(jìn)行訪問,很靈活. ? ???? *.deque可以根據(jù)一個(gè)索引進(jìn)行隨機(jī)訪問,所以我一度也以為它內(nèi)部有一塊連續(xù)的內(nèi)存,直到有一次我真這么干的時(shí)候把程序搞當(dāng)了.才意識(shí)到這個(gè)錯(cuò)誤.deque內(nèi)部應(yīng)該是由很多定長(zhǎng)的內(nèi)存塊組成的鏈表,這是我猜的,因?yàn)樗坪踔挥羞@種結(jié)構(gòu)才能和它的表現(xiàn)相符. ? ???? *.往vector,deque里添加數(shù)據(jù)應(yīng)該都是很快的吧,畢竟這是這兩個(gè)容器的賣點(diǎn).這個(gè)我沒有具體測(cè)過. ? ???? *.vector的遍歷速度是很快的,應(yīng)該是到極限了,不管你用iterator來遍歷還是用一個(gè)遞增的下標(biāo)進(jìn)行訪問,經(jīng)過編譯器的優(yōu)化都可以有最高的效率. ? ???? *.deque的遍歷速度也不慢,如果使用iterator來遍歷,可以有接近于vector的效率,但如果直接用遞增的下標(biāo)進(jìn)行遍歷,好像編譯器無法優(yōu)化至最高效率,好像慢一倍左右: ????? std::deque<int> buf; ????? std::deque<int>::iterator it; ????? int sum=0; ????? for (it=buf.begin();it!=buf.end();it++)? //這樣遍歷比較快 ??????????? sum+=*it; ????? for (int i=0;i<buf.size();i++)? //這樣遍歷比較慢 ??????????? sum+=buf[i]; ? ???? *.vector內(nèi)部分配的內(nèi)存是永不釋放的,即使你調(diào)用clear()也不會(huì),這一點(diǎn)很不好,有誤導(dǎo)性.有可能一個(gè)vector只在瞬間需要很大的容 量,但大多數(shù)時(shí)間只需要很小的容量,結(jié)果卻是長(zhǎng)時(shí)間的占用了很大的,沒有被使用到的內(nèi)存.vector也沒有提供函數(shù)來釋放它內(nèi)部的內(nèi)存,不過有一個(gè)簡(jiǎn)單 的辦法,前幾天在網(wǎng)上找到的: ???? i_math::vector<BYTE>buf; ???? buf.resize(100000);//分配了一塊至少100000 bytes的內(nèi)存 ???? if (TRUE)//清空buf的內(nèi)存 ???? { ?????????? i_math::vector<BYTE> t; ?????????? buf.swap(t);//把這塊內(nèi)存交換到一個(gè)臨時(shí)的vector里去 ???? } ???? assert(buf.capacity()==0);//內(nèi)存被清空了 ? ???? *.deque就不一樣了,deque永遠(yuǎn)不會(huì)占用太多冗余的內(nèi)存,你只需要把它resize()到一個(gè)你希望的大小,它會(huì)自動(dòng)釋放掉那些被多余占用的內(nèi)存 ? ???? *.vector還有一個(gè)不好的地方,當(dāng)你往一個(gè)vector里添加一個(gè)成員的時(shí)候,所有指向這個(gè)vector的原來成員的指針就不能保證有效了,因?yàn)?vector會(huì)re-alloc內(nèi)存.而deque不會(huì),無論從前面還是后面添加新成員,舊的成員都不會(huì)移動(dòng)位置,這一點(diǎn)有時(shí)候很有用. ? ???? 所以我覺得deque其實(shí)在很多地方都有優(yōu)勢(shì),比起vector,它欠缺的就是內(nèi)存不連續(xù),使用起來不夠靈活,但它對(duì)內(nèi)存使用的更經(jīng)濟(jì),而訪問的效率也比 vector慢不了太多,當(dāng)然,它還能從前面快速插入刪除,這是壓倒性的優(yōu)勢(shì).總之,deque是在關(guān)鍵時(shí)候能幫上忙的那種,平時(shí)可能還是vector更 好用一些. ? ???? 最后順便說說list,我一點(diǎn)也不喜歡list,幾乎沒怎么用過,往list里添加成員是很慢的(相對(duì)與vector,deque),好像每添加一個(gè)成員 都要分配一次內(nèi)存,它的遍歷也很慢,好像就比map的遍歷快一點(diǎn),不能隨機(jī)訪問.唯一的優(yōu)勢(shì)就是可以在容器中間插入刪除,不過我覺得都是可以用 vector/deque加上一些技巧解決的。反正我在程序里很少碰到過非用list不可的情況,也許是我寫的程序類型還不夠多吧呵呵. ?總結(jié)
以上是生活随笔為你收集整理的关于VECTOR和DEQUE的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: topcoder srm 380 div
- 下一篇: 在 Windows XP 下查看所有卷标