一個容器就是一些特定類型對象的集合數組
以下圖所示 數組是一個大小固定的數據結構,支持高效的隨機訪問,時間複雜度爲O(1),可是插入與刪除等操做比較低效,時間複雜度爲O(n),須要作大量的數據搬移工做。所以該容器支持快速隨機訪問,不支持添加或刪除元素。數據結構
下圖爲一個單鏈表,與數組相反,它並不須要一塊連續的內存空間,它經過「指針」將一組零散的內存塊串聯起來使用,鏈表的特色爲隨機訪問複雜度高,時間複雜度爲O(n),可是插入與刪除操做比較高效,時間複雜度爲O(1)。函數
所以只支持單向順序訪問,在鏈表任何位置進行插入刪除操做都很快。spa
下圖爲一個雙向鏈表,與單向鏈表相似,只是在每一個節點多了一個前驅指針,因此該鏈表支持雙向遍歷。指針
所以該容器支持雙向順序訪問,在鏈表任何位置進行插入刪除操做都很快。對象
下圖爲單向隊列的數據結構,隊列跟棧同樣,也是一種抽象的數據結構。它具備先進先出的特性,支持在隊尾插入元素,在隊頭刪除元素。deque爲雙向隊列的順序容器,顧名思義,雙向隊列的不一樣之處在於隊頭也是隊尾,隊尾也是隊頭。blog
所以deque這種容器支持快速隨機訪問,在頭尾位置插入/刪除速度很快。隊列
vector其實也是一個數組結構,只不過通過對數組內存空間的管理,使得vector成爲了一個動態的數組結構。內存
所以vector爲可變大小數組,支持快速隨機訪問,在尾部以外的位置插入或刪除元素可能很慢。string
與vector相似的容器,但專門用來保存字符。隨機訪問快。在尾部插入刪除速度快。
除非有很好的理由使用其餘容器,不然應使用vector。
若是程序有不少小元素,且空間額外開銷很重要,則不要使用鏈表。由於鏈表每一個節點都會至少有一個後繼指針,所以會佔用不少額外空間。
若是程序要求隨機訪問元素,則使用數組(vector)或隊列(deque)。string也支持隨機訪問,可是該容器專門用於保存字符,array則是由於該數組爲固定大小數組。
若是程序要求在容器的中間插入或刪除元素,應使用鏈表。
若是程序要求在容器的頭尾插入或刪除元素,但不在中間插入,則使用隊列。
若是程序要求只有在讀取輸入時須要在容器中插入元素,隨後須要隨機訪問元素,則
首先肯定真的須要中間插入元素,當處理輸入數據時,一般能夠很容易的在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,...} |
賦值與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 |