(GeekBand)STL與泛型編程 學(xué)習(xí)筆記(1)

這期干貨太多,原諒小弟來不及整理。。
簡(jiǎn)單的說幾點(diǎn)吧。

順序容器
三種容器均支持resieze()操作,重新劃定容器大小,且此函數(shù)有重載。
vector
vector和built-in數(shù)組類似,是一個(gè)在堆上建立的一維數(shù)組,它擁有一段連續(xù)的內(nèi)存空間,并且起始地址不變,因此 它能非常好的支持隨即存取,即[]操作符。vector因?yàn)榇鎯?chǔ)在堆上,所以支持erase( ), resieze()(重新劃分容器容量)等操作; vector不用擔(dān)心越界當(dāng)空間不夠用的時(shí)候,系統(tǒng)會(huì)自動(dòng)按照一定的比例(對(duì)capacity( )大小)進(jìn)行擴(kuò)充。在vector序列末尾添加(push_back( ))或者刪除(pop_back( ))對(duì)象效率高,在中間進(jìn)行插入或刪除效率很低,主要是要進(jìn)行元素的移動(dòng)和內(nèi)存的拷貝,原因就在于當(dāng)內(nèi)存不夠用的時(shí)候要執(zhí)行重新分配內(nèi)存,拷貝對(duì)象到新存儲(chǔ)區(qū),銷毀old對(duì)象,釋放內(nèi)存等操 作,如果對(duì)象很多的話,這種操作代價(jià)是相當(dāng)高的。為了減少這種代價(jià),使用vector最理想的情況就是事先知道所要裝入的對(duì)象數(shù)目,用成員函式 reserve( )預(yù)定下來;vector最大的優(yōu)點(diǎn)莫過于是檢索(用operator[ ])速度在這三個(gè)容器中是最快的,

list
list的本質(zhì)是一個(gè)雙向鏈表(根據(jù)sgi stl源代碼),內(nèi)存空間不連續(xù),通過指針進(jìn)行操作。說道鏈表,它的高效率首先表現(xiàn)是插入,刪除元素,進(jìn)行排序等等需要移動(dòng)大量元素的操作。顯然鏈表沒有檢索操作operator[ ], 也就是說不能對(duì)鏈表進(jìn)行隨機(jī)訪問,而只能從頭至尾地遍歷,這是它的一個(gè)缺陷。list有不同于前兩者的某些成員方法,如合并list的方法splice( ), 排序sort( ),交換list 的方法swap( )等等。

deque
deque是一個(gè)double-ended queue是由多個(gè)連續(xù)內(nèi)存塊構(gòu)成,deque是list和vector的兼容,分為多個(gè)塊,每一個(gè)塊大小是512字節(jié),塊通過map塊管理,map塊里保存每個(gè)塊得首地址。因此該容器也有索引操作operator[ ],效率沒vector高。另外,deque比vector多了push_front( ) & pop_front( )操作。在兩端進(jìn)行此操作時(shí)與list的效率 差不多

下面是選擇順序容器類型的一些準(zhǔn)則
1.如果我們需要隨機(jī)訪問一個(gè)容器則vector要比list好得多 。
2.如果我們已知要存儲(chǔ)元素的個(gè)數(shù)則vector 又是一個(gè)比list好的選擇。
3.如果我們需要的不只是在容器兩端插入和刪除元素則list顯然要比vector好
4.除非我們需要在容器首部插入和刪除元素否則vector要比deque好。
5.如果只在容易的首部和尾部插入數(shù)據(jù)元素,則選擇deque.
6.如果只需要在讀取輸入時(shí)在容器的中間位置插入元素,然后需要隨機(jī)訪問元素,則可考慮輸入時(shí)將元素讀入到一個(gè)List容器,接著對(duì)此容器重新排序,使其適合順序訪問,然后將排序后的list容器復(fù)制到一個(gè)vector容器中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容