STL幾種容器的區別簡介

來源:互聯網
上載者:User
雖然這幾種都用過了,但對於它的理解還沒有形成概念性的知識,看過這個後覺得形成了架構性的知識,覺得很有用,所以轉載。vector - 會自動成長的數組

vector又稱為向量數組,他是為瞭解決程式中定義的數組是
不能動態改變大小這個缺點而出現的。
一般程式實現是在類建立的時候同時建立一個定長數組,
隨著資料不斷被寫入,一旦數組被填滿,則重新開闢一塊更大的記憶體區,
把原有的資料複製到新的記憶體區,拋棄原有的記憶體,如此反覆。

由於程式自動管理數組的增長,對於我們程式員來說確實輕鬆了不少,
只管把資料往裡面插就行了,當然把實體記憶體和虛擬記憶體插爆掉了
就是作業系統來找你麻煩了:-)

vector由於數組的增長只能向前,所以也只提供了後端插入和後端刪除,
也就是push_back和pop_back。當然在前端和中間要操作資料也是可以的,
用insert和erase,但是前端和中間對資料進行操作必然會引起資料區塊的移動,
這對效能影響是非常大的。

對於所有數組來說,最大的優勢就是隨機訪問的能力。
在vector中,提供了at和[]運算子這兩個方法來進行隨機訪問。
由於每個資料大小相同,並且無間隔地排列在記憶體中,
所以要對某一個資料操作,只需要用一個運算式就能直接計算出地址:
address = base + index * datasize

同樣,對vector進行記憶體開闢,初始化,清除都是不需要花大力氣的,
從頭到尾都只有一塊記憶體。

 

list - 擅長插入刪除的鏈表

有黑必有白,世界萬物都是成對出現的。
鏈表對於數組來說就是相反的存在。
數組本身是沒有動態增長能力的(程式中也必須重新開闢記憶體來實現),
而鏈表強悍的就是動態增長和刪除的能力。
但對於數組強悍的隨機訪問能力來說的話,鏈表卻很弱。

list是一個雙向鏈表的實現。
為了提供雙向遍曆的能力,list要比一般的資料單元多出兩個指向前後的指標。
這也是沒辦法的,畢竟現在的PC記憶體結構就是一個大數組,
鏈表要在不同的環境中實現自己的功能就需要花更多空間。

list提供了push_back,push_front,pop_back,pop_front四個方法
來方便操作list的兩端資料的增加和刪除,不過少了vector的at和[]運算子的
隨機訪問資料的方法。並不是不能實現,而是list的設計者
並不想讓list去做那些事情,因為他們會做得非常差勁。

對於list來說,清除容器內所有的元素是一件苦力活,
因為所有資料單元的記憶體都不連續,list只有一個一個遍曆來刪除。

 

deque - 擁有vector和list兩者優點的雙端隊列

黑與白,處於這兩個極端之間的就是令人愉悅的彩色了。
deque作為vector和list的結合體,確實有著不凡的實力。

STL的deque的實現沒有怎麼去看過,不過根據我自己的猜測,
應該是把數組分段化,在分段的數組上添加指標來把所有段連在一起,
最終成為一個大的數組。

deque和list一樣,提供了push_back,push_front,
pop_back,pop_front四個方法。可以想象,如果要對deque的兩端進行操作,
也就是要對第一段和最後一段的定長數組進行重新分配記憶體區,
由於分過段的數組很小,重新分配的開銷也就不會很大。

deque也和vector一樣,提供了at和[]運算子的方法。
要計算出某個資料的地址的話,雖然要比vector麻煩一點,
但效率要比list高多了。
首先和list一樣進行遍曆,每次遍曆的時候累積每段數組的大小,
當遍曆到某個段,而且baseN <= index < baseN + baseN_length的時候,
通過address = baseN + baseN_index就能計算出地址
由於分過段的後鏈表的長度也不是很長,所以遍曆對於
整體效能的影響就微乎其微了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.