C STL中各容器記憶體 優劣的分析

2021-09-26 02:50:55 字數 2448 閱讀 2515

各種容器的元素在記憶體中的儲存方式

1、vector(向量):相當於陣列,但其大小可以不預先指定,並且自動擴充套件。它可以像陣列一樣被操作,

由於它的特性我們完全可以將vector 看作動態陣列。在建立乙個vector 後,它會自動在記憶體中分配一塊連續的

記憶體空間進行資料儲存,初始的空間大小可以預先指定也可以由vector 預設指定,這個大小即capacity ()函式

的返回值。當儲存的資料超過分配的空間時vector 會重新分配一塊記憶體塊,但這樣的分配是很耗時的,效率非常低。

2、deque(佇列):它不像vector 把所有的物件儲存在一塊連續的記憶體塊,而是採用多個連續的儲存塊,並且在乙個

對映結構中儲存對這些塊及其順序的跟蹤。向deque 兩端新增或刪除元素的開銷很小,它不需要重新分配空間。

3、list(列表):是乙個線性鍊錶結構,它的資料由若干個節點構成,每乙個節點都包括乙個資訊塊(即實際儲存的資料)、

乙個前驅指標和乙個後驅指標。它無需分配指定的記憶體大小且可以任意伸縮,這是因為它儲存在非連續的記憶體空間中,

並且由指標將有序的元素鏈結起來。

4、set, multiset, map, multimap 是一種非線性的樹結構,具體的說採用的是一種比較高效的特殊的

平衡檢索二叉樹—— 紅黑樹結構。

各種容器優劣分析

1、vector:

優點:a、支援隨機訪問,訪問效率高和方便,它像陣列一樣被訪問,即支援[ ] 操作符和vector.at()。

b、節省空間,因為它是連續儲存,在儲存資料的區域都是沒有被浪費的,但是要明確一點vector 大多情況下並不是滿存的,在未儲存的區域實際是浪費的。

缺點:a、在內部進行插入、刪除操作效率非常低。

b、只能在vector 的最後進行push 和pop ,不能在vector 的頭進行push 和pop 。

c、 當動態新增的資料超過vector 預設分配的大小時要進行記憶體的重新分配、拷貝與釋放,這個操作非常消耗能。

2、list:

優點:不使用連續的記憶體空間這樣可以隨意地進行動態操作,插入、刪除操作效率高;

缺點:a、不能進行內部的隨機訪問,即不支援[ ] 操作符和vector.at(),訪問效率低。

b、相對於verctor 占用更多的記憶體。

3、deque:

優點:a、支援隨機訪問,方便,即支援[ ] 操作符和vector.at() ,但效能沒有vector 好;

b、可以在兩端進行push 、pop 。

缺點:在內部進行插入、刪除操作效率低。

綜合:vector 的查詢效能最好,並且在末端增加資料也很好,除非它重新申請記憶體段;適合高效地隨機儲存。 

list 是乙個鍊錶,任何乙個元素都可以是不連續的,但它都有兩個指向上一元素和下一元素的指標。所以它對插入、刪除元素效能是最好的,而查詢效能非常差;適合 大量地插入和刪除操作而不關心隨機訪問的需求。

deque 是介於兩者之間,它兼顧了陣列和鍊錶的優點,它是分塊的鍊錶和多個陣列的聯合。所以它有被list 好的查詢效能,有被vector 好的插入、刪除效能。 如果你需要隨即訪問又關心兩端資料的插入和刪除,那麼deque 是最佳之選。

3、關聯容器的特點是明顯的,相對於順序容器,有以下幾個主要特點:

a, 其內部實現是採用非線性的二叉樹結構,具體的說是紅黑樹的結構原理實現的;

b, set 和map 保證了元素的唯一性,mulset 和mulmap 擴充套件了這一屬性,可以允許元素不唯一;

c, 元素是有序的集合,預設在插入的時候按公升序排列。

基於以上特點,

a, 關聯容器對元素的插入和刪除操作比vector 要快,因為vector 是順序儲存,而關聯容器是鏈式儲存;比list 要慢,是因為即使它們同是鏈式結構,但list 是線性的,而關聯容器是二叉樹結構,其改變乙個元素涉及到其它元素的變動比list 要多,並且它是排序的,每次插入和刪除都需要對元素重新排序;

b, 關聯容器對元素的檢索操作比vector 慢,但是比list 要快很多。vector 是順序的連續儲存,當然是比不上的,但相對鏈式的list 要快很多是因為list 是逐個搜尋,它搜尋的時間是跟容器的大小成正比,而關聯容器 查詢的複雜度基本是log(n) ,比如如果有1000 個記錄,最多查詢10 次,1,000,000 個記錄,最多查詢20 次。容器越大,關聯容器相對list 的優越性就越能體現;

c, 在使用上set 區別於vector,deque,list 的最大特點就是set 是內部排序的,這在查詢上雖然遜色於vector ,但是卻大大的強於list 。

d, 在使用上map 的功能是不可取代的,它儲存了「鍵- 值」關係的資料,而這種鍵值關係採用了類陣列的方式。陣列是用數字型別的下標來索引元素的位置,而map 是用字元型關鍵字來索引元素的位置。在使用上map 也提供了一種類陣列操作的方式,即它可以通過下標來檢索資料,這是其他容器做不到的,當然也包括set 。(stl 中只有vector 和map 可以通過類陣列的方式操作元素,即如同ele[1] 方式)。

C STL中的容器

用c 寫資料結構習題也有一段時間了,不得不說stl容器對資料結構真的很有用。c stl standard template library,標準模板庫 是一套功能強大的 c 模板類,其中包含4個元件,分別為演算法 容器 函式 迭代器。所以想總結一下自己用的容器,為什麼要用它以及怎麼用?c c 原生的...

c STL中的容器

容器作為stl的重要組成部分,其主要包括兩大類 順序容器 和 關聯容器 雖說這二者都是用來儲存資料的資料結構,但是他們的底層實現和特長有很大差別 關聯容器有8種 1 map 紅黑樹 2 set 紅黑樹 3 multimap 紅黑樹 4 multiset 紅黑樹 5 unordered map 雜湊表...

C STL中的容器簡介

c stl中提供了強大的容器 containers 來替代程式中常用的資料結構,主要包括 字串 string 動態陣列 vector 佇列 queue 棧 stack 堆 priority queue 鏈結表 list 集合 set 字典 map 使用這些容器可以極大的簡化程式的編寫,提高程式設計的...