小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C++ STL基本容器string,vector,list,deque,map的比較

 昵稱5352175 2011-01-02

C++ STL基本容器string,vector,list,deque,map

 
在STL中基本容器有: string、vector、list、deque、set、map

set 和map都是無(wú)序的保存元素,只能通過它提供的接口對(duì)里面的元素進(jìn)行訪問

set:集合, 用來判斷某一個(gè)元素是不是在一個(gè)組里面,使用的比較少
map:映射,相當(dāng)于字典,把一個(gè)值映射成另一個(gè)值,如果想創(chuàng)建字典的話使用它好了

string、vector、list、deque、set 是有序容器 
1.string 

string 是basic_string<char> 的實(shí)現(xiàn),在內(nèi)存中是連續(xù)存放的.為了提高效率,都會(huì)有保留內(nèi)存,如string s= "abcd",這時(shí)s使用的空間可能就是255, 當(dāng)string再次往s里面添加內(nèi)容時(shí)不會(huì)再次分配內(nèi)存.直到內(nèi)容>255時(shí)才會(huì)再次申請(qǐng)內(nèi)存,因此提高了它的性能.
當(dāng)內(nèi)容>255時(shí),string會(huì)先分配一個(gè)新內(nèi)存,然后再把內(nèi)容復(fù)制過去,再?gòu)?fù)制先前的內(nèi)容.

對(duì)string的操作,如果是添加到最后時(shí),一般不需要分配內(nèi)存,所以性能最快;
如果是對(duì)中間或是開始部分操作,如往那里添加元素或是刪除元素,或是代替元素,這時(shí)需要進(jìn)行內(nèi)存復(fù)制,性能會(huì)降低.

如果刪除元素,string一般不會(huì)釋放它已經(jīng)分配的內(nèi)存,為了是下次使用時(shí)可以更高效.

由于string會(huì)有預(yù)保留內(nèi)存,所以如果大量使用的話,會(huì)有內(nèi)存浪費(fèi),這點(diǎn)需要考慮.還有就是刪除元素時(shí)不釋放過多的內(nèi)存,這也要考慮.

string中內(nèi)存是在堆中分配的,所以串的長(zhǎng)度可以很大,而char[]是在棧中分配的,長(zhǎng)度受到可使用的最大棧長(zhǎng)度限制.

如果對(duì)知道要使用的字符串的最大長(zhǎng)度,那么可以使用普通的char[],實(shí)現(xiàn)而不必使用string.
string用在串長(zhǎng)度不可知的情況或是變化很大的情況.

如果string已經(jīng)經(jīng)歷了多次添加刪除,現(xiàn)在的尺寸比最大的尺寸要小很多,想減少string使用的大小,可以使用:
string s = "abcdefg";
string y(s); // 因?yàn)樵俅畏峙鋬?nèi)存時(shí),y只會(huì)分配與s中內(nèi)容大一點(diǎn)的內(nèi)存,所以浪費(fèi)不會(huì)很大
s.swap(y); // 減少s使用的內(nèi)存

如果內(nèi)存夠多的話就不用考慮這個(gè)了 


capacity是查看現(xiàn)在使用內(nèi)存的函數(shù)
大家可以試試看string分配一個(gè)一串后的capacity返回值,還有其它操作后的返回值

2.vector 

vector就是動(dòng)態(tài)數(shù)組.它也是在堆中分配內(nèi)存,元素連續(xù)存放,有保留內(nèi)存,如果減少大小后內(nèi)存也不會(huì)釋放.如果新值>當(dāng)前大小時(shí)才會(huì)再分配內(nèi)存 
對(duì)最后元素操作最快(在后面添加刪除最快 ), 此時(shí)一般不需要移動(dòng)內(nèi)存,只有保留內(nèi)存不夠時(shí)才需要
對(duì)中間和開始處進(jìn)行添加刪除元素操作需要移動(dòng)內(nèi)存,如果你的元素是結(jié)構(gòu)或是類,那么移動(dòng)的同時(shí)還會(huì)進(jìn)行構(gòu)造和析構(gòu)操作,所以性能不高(最好將結(jié)構(gòu)或類的指針放入vector中,而不是結(jié)構(gòu)或類本身,這樣可以避免移動(dòng)時(shí)的構(gòu)造與析構(gòu))。
訪問方面,對(duì)任何元素的訪問都是O(1),也就是是常數(shù)的,所以vector常用來保存需要經(jīng)常進(jìn)行隨機(jī)訪問的內(nèi)容,并且不需要經(jīng)常對(duì)中間元素進(jìn)行添加刪除操作.

相比較可以看到vector的屬性與string差不多,同樣可以使用capacity看當(dāng)前保留的內(nèi)存,使用swap來減少它使用的內(nèi)存.

總結(jié)
需要經(jīng)常隨機(jī)訪問請(qǐng)用vector 

3.list 

list就是鏈表,元素也是在堆中存放,每個(gè)元素都是放在一塊內(nèi)存中 
list沒有空間預(yù)留習(xí)慣,所以每分配一個(gè)元素都會(huì)從內(nèi)存中分配,每刪除一個(gè)元素都會(huì)釋放它占用的內(nèi)存,這與上面不同,可要看好了

list在哪里添加刪除元素性能都很高,不需要移動(dòng)內(nèi)存,當(dāng)然也不需要對(duì)每個(gè)元素都進(jìn)行構(gòu)造與析構(gòu)了,所以常用來做隨機(jī)操作容器.
但是訪問list里面的元素時(shí)就開始和最后訪問最快
訪問其它元素都是O(n) ,所以如果需要經(jīng)常隨機(jī)訪問的話,還是使用其它的好

總結(jié)
如果你喜歡經(jīng)常添加刪除大對(duì)象的話,那么請(qǐng)使用list
要保存的對(duì)象不大,構(gòu)造與析構(gòu)操作不復(fù)雜,那么可以使用vector代替
list<指針>完全是性能最低的做法,這種情況下還是使用vector<指針>好,因?yàn)橹羔槢]有構(gòu)造與析構(gòu),也不占用很大內(nèi)存 


4.deque 

雙端隊(duì)列,也是在堆中保存內(nèi)容的.它的保存形式如下:

[堆1]
...
[堆2]
...
[堆3]

每個(gè)堆保存好幾個(gè)元素,然后堆和堆之間有指針指向,看起來像是list和vector的結(jié)合品,不過確實(shí)也是如此
deque可以讓你在前面快速地添加刪除元素,或是在后面快速地添加刪除元素,然后還可以有比較高的隨機(jī)訪問速度

vector是可以快速地在最后添加刪除元素,并可以快速地訪問任意元素
list是可以快速地在所有地方添加刪除元素,但是只能快速地訪問最開始與最后的元素
deque在開始和最后添加元素都一樣快,并提供了隨機(jī)訪問方法,像vector一樣使用[]訪問任意元素,但是隨機(jī)訪問速度比不上vector快,因?yàn)樗獌?nèi)部處理堆跳轉(zhuǎn)
deque也有保留空間.另外,由于deque不要求連續(xù)空間,所以可以保存的元素比vector更大,這點(diǎn)也要注意一下.還有就是在前面和后面添加元素時(shí)都不需要移動(dòng)其它塊的元素,所以性能也很高

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多