順序容器初探(上)

一個容器就是一些特定類型對象的集合數組

順序容器的數據結構

array:

以下圖所示 數組是一個大小固定的數據結構,支持高效的隨機訪問,時間複雜度爲O(1),可是插入與刪除等操做比較低效,時間複雜度爲O(n),須要作大量的數據搬移工做。所以該容器支持快速隨機訪問,不支持添加或刪除元素。數據結構

forward_list:

下圖爲一個單鏈表,與數組相反,它並不須要一塊連續的內存空間,它經過「指針」將一組零散的內存塊串聯起來使用,鏈表的特色爲隨機訪問複雜度高,時間複雜度爲O(n),可是插入與刪除操做比較高效,時間複雜度爲O(1)。函數

所以只支持單向順序訪問,在鏈表任何位置進行插入刪除操做都很快。spa

 

 

 

 

list:

下圖爲一個雙向鏈表,與單向鏈表相似,只是在每一個節點多了一個前驅指針,因此該鏈表支持雙向遍歷。指針

所以該容器支持雙向順序訪問,在鏈表任何位置進行插入刪除操做都很快。對象

 

deque:

下圖爲單向隊列的數據結構,隊列跟棧同樣,也是一種抽象的數據結構。它具備先進先出的特性,支持在隊尾插入元素,在隊頭刪除元素。deque爲雙向隊列的順序容器,顧名思義,雙向隊列的不一樣之處在於隊頭也是隊尾,隊尾也是隊頭。blog

所以deque這種容器支持快速隨機訪問,在頭尾位置插入/刪除速度很快。隊列

 

vector:

vector其實也是一個數組結構,只不過通過對數組內存空間的管理,使得vector成爲了一個動態的數組結構。內存

所以vector爲可變大小數組,支持快速隨機訪問,在尾部以外的位置插入或刪除元素可能很慢。string

string:

與vector相似的容器,但專門用來保存字符。隨機訪問快。在尾部插入刪除速度快。

容器選擇原則

  1. 除非有很好的理由使用其餘容器,不然應使用vector。

  2. 若是程序有不少小元素,且空間額外開銷很重要,則不要使用鏈表。由於鏈表每一個節點都會至少有一個後繼指針,所以會佔用不少額外空間。

  3. 若是程序要求隨機訪問元素,則使用數組(vector)或隊列(deque)。string也支持隨機訪問,可是該容器專門用於保存字符,array則是由於該數組爲固定大小數組。

  4. 若是程序要求在容器的中間插入或刪除元素,應使用鏈表。

  5. 若是程序要求在容器的頭尾插入或刪除元素,但不在中間插入,則使用隊列。

  6. 若是程序要求只有在讀取輸入時須要在容器中插入元素,隨後須要隨機訪問元素,則

    • 首先肯定真的須要中間插入元素,當處理輸入數據時,一般能夠很容易的在vector容器末追加數據,再調用標準庫中的sort函數來對容器中的元素進行重排,以免中間插入操做

    • 若是必須在中間位置插入元素,則在輸入階段考慮list,一旦輸入完成,將list中的數據拷貝到另外一個vector中。

容器操做

構造函數  
C c; 默認構造函數,構造空容器(array)
C c1(c2); 構造 c2 的拷貝 c1
C c(b,e); 構造 c ,將迭代器 b 和 e指定的範圍內的元素拷貝到c
C c{a,b,c,...} 列表初始化c

 

賦值與swap  
c1=c2; 將 c1 中的元素替換爲 c2 中的元素
c1=(a,b,c...); 將 c1 中的元素替換爲列表中元素(除array)
a.swap(b); 交換 a 和 b 的元素,swap一般比c2從c1拷貝元素快得多
swap(a,b); 與 a.swap 等價
assign操做 不適用於關聯容器和array
seq.assign(b,e); 將 seq 中的元素替換爲迭代器 b 和 e 所表示的範圍中的元素。迭代器 b 和 e 不能指向seq中的元素
seq.assign(i1); 將seq中的元素替換爲初始化列表 i1 中的元素
seq.assign(n,t); 將 seq 中的元素替換爲 n 個值爲 t 的元素

大小  
c.size(); c中元素的數目(不支持forward_list)
c.max_size(); c可保存的最大元素數目
c.empty(); 若c中存儲了元素,返回 false,不然返回 true
相關文章
相關標籤/搜索