序列容器

一、序列容器

(1)vector

 vector和built-in數組相似,擁有一段連續的內存空間,能很是好的支持隨即存取,即[]操做符,但因爲它的內存空間是連續的,因此在中間進行插入和刪除會形成內存塊的拷貝。數組

另外,當插入較多的元素後,預留內存空間可能不夠,須要從新申請一塊足夠大的內存並把原來的數據拷貝到新的內存空間。這些影響了vector的效率,可是實際上用的最多的仍是vector容器,建議大多數時候使用vector效率通常是不錯的。數據結構

(2)list

list就是數據結構中的雙向鏈表(根據sgi stl源代碼),所以它的內存空間是不連續的,經過指針來進行數據的訪問,這個特色使得它的隨即存取變的很是沒有效率,所以它沒有提供[]操做符的重載。但因爲鏈表的特色,它能夠以很好的效率支持任意地方的刪除和插入。
ui

(3)deque

deque是一個double-ended queue,它的具體實現不太清楚,但知道它具備如下兩個特色:它支持[]操做符,也就是支持隨即存取,而且和vector的效率相差無幾,它支持在兩端的操做:push_back,push_front,pop_back,pop_front等,而且在兩端操做上與list的效率也差很少。
spa

二、特色

(1)vector

優勢:指針

隨機存取,即[]操做和vector.at()排序

動態操做,push_back()與pop_back()索引

自動調整內存,節省空間內存

缺點:效率

實現插入與刪除操做效率低容器

只能在尾部插入與刪除,在頭部插入與刪除消耗時間規模與容器大小成正比。

當動態添加的數據超過默認內存大小時,要進行總體的從新分配,拷貝與釋放。

(2)list

優勢:

內存不連續

動態操做,插入與刪除效率高

可在兩端進行pop,push

缺點:

不能隨機訪問

相對於vector佔用內存多

(3)deque

優勢:

隨機訪問,即[]操做和deque.at()

插入與刪除方便

可在雙端進行pop,push

缺點:

佔用內存多。

三、聯繫區別

(1)聯繫

三者都能實現resize()來從新調整容器的大小。

(2)區別

1)vector能實現隨即存取,即[]操做,而list不能,deque是兩者的結合體,也可以實現索引操做[],但效率沒有vector高。

2)vector適合在文件的末尾實現刪除元素的操做pop_back()與插入操做push_back(),在中間時效率很是低下。而list能夠在容器的任何位置實現插入與刪除操做。

緣由:vector的元素地址連續,若是在中間插入與刪除操做,可能會致使原來的內存地址不足以存儲當前的元素,須要從新分配內存地址,這就須要將原來的全部元素拷貝到新內存,釋放舊的內存地址等操做,操做代價高昂。而list元素內存地址不連續,用指針操做,其自己是一個雙向鏈表,它的高效率體如今插入,刪除以及排序等移動大量元素的操做。

四、選擇容器類型的準則

1. 若是你須要高效的隨即存取,而不在意插入和刪除的效率,使用vector

2. 若是你須要大量的插入和刪除,而不關心隨即存取,則應使用list

3. 若是你須要隨即存取,並且關心兩端數據的插入和刪除,則應使用deque。

相關文章
相關標籤/搜索