vector的特點:
(1)指定一塊如同數組一樣的連續存儲,但空間可以動態擴展。即它可以像數組一樣操作,并且可以進行動態操作。通常體現在push_back() pop_back()。
(2)隨機訪問方便,它像數組一樣被訪問,即支持[ ]操作符和vector.at()
(3)節省空間,因為它是連續存儲,在存儲數據的區域都是沒有被浪費的,但是要明確一點vector大多情況下并不是滿存的,在未存儲的區域實際是浪費的。
(4)在內部進行插入、刪除操作效率非常低,這樣的操作基本上是被禁止的。Vector被設計成只能在后端進行追加和刪除操作,其原因是vector內部的實現是按照順序表的原理。
(5)只能在vector的最后進行push和pop,不能在vector的頭進行push和pop。
(6)當動態添加的數據超過vector默認分配的大小時要進行內存的重新分配、拷貝與釋放,這個操作非常消耗性能。所以要vector達到最優的性能,最好在創建vector時就指定其空間大小。
雙向鏈表list
是一個線性鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個后驅指針。它無需分配指定的內存大小且可以任意伸縮,這是因為它存儲在非連續的內存空間中,并且由指針將有序的元素鏈接起來。
由于其結構的原因,list隨機檢索的性能非常的不好,因為它不像vector那樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠后,它的檢索時間就越長。檢索時間與目標元素的位置成正比。
雖然隨機檢索的速度不夠快,但是它可以迅速地在任何節點進行插入和刪除操作。因為list的每個節點保存著它在鏈表中的位置,插入或刪除一個元素僅對最多三個元素有所影響,不像vector會對操作點之后的所有元素的存儲地址都有所影響,這一點是vector不可比擬的。
list的特點:
(1)不使用連續的內存空間這樣可以隨意地進行動態操作;
(2)可以在內部任何位置快速地插入或刪除,當然也可以在兩端進行push和pop。
(3)不能進行內部的隨機訪問,即不支持[ ]操作符和vector.at();
(4)相對于verctor占用更多的內存。
雙端隊列deque
是一種優化了的、對序列兩端元素進行添加和刪除操作的基本序列容器。它允許較為快速地隨機訪問,但它不像vector把所有的對象保存在一塊連續的內存塊,而是采用多個連續的存儲塊,并且在一個映射結構中保存對這些塊及其順序的跟蹤。向deque兩端添加或刪除元素的開銷很小。它不需要重新分配空間,所以向末端增加元素比vector更有效。
實際上,deque是對vector和list優缺點的結合,它是處于兩者之間的一種容器。
deque的特點:
(1)隨機訪問方便,即支持[ ]操作符和vector.at(),但性能沒有vector好;
(2)可以在內部進行插入和刪除操作,但性能不及list;
(3)可以在兩端進行push、pop;
vector是一段連續的內存塊,而deque是多個連續的內存塊,list是所有數據元素分開保存,可以是任何兩個元素沒有連續。
vector的查詢性能最好,并且在末端增加數據也很好,除非它重新申請內存段;適合高效地隨機存儲。
list是一個鏈表,任何一個元素都可以是不連續的,但它都有兩個指向上一元素和下一元素的指針。所以它對插入、刪除元素性能是最好的,而查詢性能非常差;適合大量地插入和刪除操作而不關心隨機存取的需求。
deque是介于兩者之間,它兼顧了數組和鏈表的優點,它是分塊的鏈表和多個數組的聯合。所以它有被list好的查詢性能,有被vector好的插入、刪除性能。如果你需要隨即存取又關心數據的插入和刪除,那么deque是最佳之選。