对比vector、deque、list的优缺点
1、vector
連續存儲結構,每個元素在內存上是連續的;支持高效的隨機訪問和在尾端插入/刪除操作,但其他位置的插入/刪除操作效率低下;相當于一個數組,但是與數組的區別為:內存空間的擴展。vector支持不指定vector大小的存儲,但是數組的擴展需要程序員自己寫。
vector的內存分配實現原理:
STL內部實現時,首先分配一個非常大的內存空間預備進行存儲,即capacity()函數返回的大小,當超過此分配的空間時再整體重新放分配一塊內存存儲(VS6.0是兩倍,VS2005是1.5倍),所以這給人以vector可以不指定vector即一個連續內存的大小的感覺。通常此默認的內存分配能完成大部分情況下的存儲。
擴充空間(不論多大)都應該這樣做:
(1)配置一塊新空間
(2)將舊元素一一搬往新址
(3)把原來的空間釋放還給系統
注:vector 的數據安排以及操作方式,與array 非常相似。兩者的唯一差別在于空間的利用的靈活性。Array 的擴充空間要程序員自己來寫。
vector的元素增加和刪除都只是在尾部進行的,無法對首部的元素進行操作
2、deque
連續存儲結構,即其每個元素在內存上也是連續的,類似于vector,不同之處在于,deque提供了兩級數組結構, 第一級完全類似于vector,代表實際容器;另一級維護容器的首位地址。這樣,deque除了具有vector的所有功能外,還支持高效的首/尾端插入/刪除操作。
deque 雙端隊列 double-end queue
deque是由一段一段的定量連續空間構成。一旦有以要在deque的前端和尾端增加新空間,便配置一段定量連續空間,串在整個deque的頭端或尾端。deque的最大任務就是在這些分段的連續空間上,維護其整體連續的假象,并提供隨機存取的接口。避開了“重新配置、復制、釋放”的輪回,代價是復雜的迭代器架構。
?
image.png
deque是在功能上合并了vector和list。
優點:(1) 隨機訪問方便,即支持[ ]操作符和vector.at()
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:占用內存多
相對于vector,deque可以在頭部對數據進行添加和刪除,但是依舊不支持高效隨機的插入、刪除操作
使用區別:
(1)如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
(2)如果你需要大量的插入和刪除,而不關心隨機存取,則應使用list
(3)如果你需要隨機存取,而且關心兩端數據的插入和刪除,則應使用deque
3、list
非連續存儲結構,具有雙鏈表結構,每個元素維護一對前向和后向指針,因此支持前向/后向遍歷。支持高效的隨機插入/刪除操作,但隨機訪問效率低下,且由于需要額外維護指針,開銷也比較大。每一個結點都包括一個信息快Info、一個前驅指針Pre、一個后驅指針Post。可以不分配必須的內存大小方便的進行添加和刪除操作。使用的是非連續的內存空間進行存儲。
優點:(1) 不使用連續內存完成動態操作。
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 不能進行內部的隨機訪問,即不支持[ ]操作符和vector.at()
(2) 相對于verctor占用內存多
使用區別:
(1)如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
(2)如果你需要大量的插入和刪除,而不關心隨機存取,則應使用list
(3)如果你需要隨機存取,而且關心兩端數據的插入和刪除,則應使用deque
4、vector VS. list VS. deque:
a、若需要隨機訪問操作,則選擇vector;
b、若已經知道需要存儲元素的數目,則選擇vector;
c、若需要隨機插入/刪除(不僅僅在兩端),則選擇list
d、只有需要在首端進行插入/刪除操作的時候,還要兼顧隨機訪問效率,才選擇deque,否則都選擇vector。
e、若既需要隨機插入/刪除,又需要隨機訪問,則需要在vector與list間做個折中-deque。
f、當要存儲的是大型負責類對象時,list要優于vector;當然這時候也可以用vector來存儲指向對象的指針,
同樣會取得較高的效率,但是指針的維護非常容易出錯,因此不推薦使用。
?
vector與deque的迭代器支持算術運算,list的迭代器只能進行++/--操作,不支持普通的算術運算。
向量中的iterator在使用后就釋放了,但是鏈表list不同,它的迭代器在使用后還可以繼續用;鏈表特有的;
list、deque是雙向的所以存在pop_front()、push_front(val)、pop_back()、push_back(val)的操作;但是vector是單向的,只支持pop_back()、push_back(val)的操作
作者:王王王王王景
鏈接:https://www.jianshu.com/p/97121d6ef4c5
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的对比vector、deque、list的优缺点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++容器的选择和详细操作方法总结(有自
- 下一篇: STL库容器vector at函数