1. 程式人生 > >vector,map,list,queue的區別詳細解析

vector,map,list,queue的區別詳細解析

1。vector  (連續的空間儲存,可以使用[]操作符)快速的訪問隨機的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開始分配的空間不夠的話,有一個重新分配更大空間,然後拷貝的效能開銷.

2。deque (小片的連續,小片間用連結串列相連,實際上內部有一個map的指標,因為知道型別,所以還是可以使用[],只是速度沒有vector快)快速的訪問隨機的元素,快速的在開始和末尾插入元素,隨機的插入,刪除元素要慢,空間的重新分配要比vector快,重新分配空間後,原有的元素不需要拷貝。對deque的排序操作,可將deque先複製到vector,排序後在複製回deque。

3。list   (每個元素間用連結串列相連)訪問隨機元素不如vector快,隨機的插入元素比vector快,對每個元素分配空間,所以不存在空間不夠,重新分配的情況

4。set 內部元素唯一,用一棵平衡樹結構來儲存,因此遍歷的時候就排序了,查詢也比較快的哦。

5。map 一對一的對映的結合,key不能重複。

6。stack 介面卡,必須結合其他的容器使用,stl中預設的內部容器是deque。先進後出,只有一個出口,不允許遍歷。

7。queue 是受限制的deque,內部容器一般使用list較簡單。先進先出,不允許遍歷。

下面是選擇順序容器型別的一些準則  
1.如果我們需要隨機訪問一個容器則vector要比list好得多 。

2.如果我們已知要儲存元素的個數則vector 又是一個比list好的選擇。  

3.如果我們需要的不只是在容器兩端插入和刪除元素則list顯然要比vector好  

4.除非我們需要在容器首部插入和刪除元素否則vector要比deque好。

5.如果只在容易的首部和尾部插入資料元素,則選擇deque.

6.如果只需要在讀取輸入時在容器的中間位置插入元素,然後需要隨機訪問元素,則可考慮輸入時將元素讀入到一個List容器,接著對此容器重新拍學,使其適合順序訪問,然後將排序後的list容器複製到一個vector容器中

最後:

vector和built-in陣列類似,它擁有一段連續的記憶體空間,並且起始地址不變,因此它能非常好的支援隨即存取,即[]操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝,另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大影響了vector的效率。

list就是資料結構中的雙向連結串列(根據sgi stl原始碼),因此它的記憶體空間可以是不連續的,通過指標來進行資料的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它沒有提供[]操作符的過載。但由於連結串列的特點,它可以以很好的效率支援任意地方的刪除和插入。