前言
序列容器以線性序列的方式存儲元素。它沒有對元素進行排序,元素的順序和存儲它們的順序相同。一般來說,有 5 種標準的序列容器,每種容器都具有不同的特性:
- array<T,N> (數組容器) :是一個長度固定的序列,有N個T類型的對象,不能增加或刪除元素。
- vector<T> (向量容器) :
是一個長度可變的序列,用來存放T類型的對象。必要時,可以自動增加容量,但只能在序列的末尾高效地增加或刪除元素。 - deque<T> (雙向隊列容器) :
是一個長度可變的、可以自動增長的序列,在序列的兩端都不能高效地增加或刪除元素。 - list<T> (鏈表容器) :
是一個長度可變的、由 T 類型對象組成的序列,它以雙向鏈表的形式組織元素,在這個序列的任何地方都可以高效地增加或刪除元素。訪問容器中任意元素的速度要比前三種容器慢,這是因爲 list<T> 必須從第一個元素或最後一個元素開始訪問,需要沿着鏈表移動,直到到達想要的元素。 - forward list<T> (正向鏈表容器) :
是一個長度可變的、由 T 類型對象組成的序列,它以單鏈表的形式組織元素,是一類比鏈表容器快、更節省內存的容器,但是它內部的元素只能從第一個元素開始訪問。
什麼是序列式容器
轉載請註明文章來源:https://blog.csdn.net/y601500359/article/details/105409417
現在我們來說說序列式容器到底是什麼。
所謂序列容器,即以線性排列(類似普通數組的存儲方式)來存儲某一指定類型(例如 int、double 等)的數據,需要特殊說明的是,該類容器並不會自動對存儲的元素按照值的大小進行排序。
需要注意的是,序列容器只是一類容器的統稱,並不指具體的某個容器,序列容器大致包含以下幾類容器:
- array<T,N>(數組容器):
表示可以存儲 N 個 T 類型的元素,是 C++ 本身提供的一種容器。此類容器一旦建立,其長度就是固定不變的,這意味着不能增加或刪除元素,只能改變某個元素的值; - vector<T>(向量容器):
用來存放 T 類型的元素,是一個長度可變的序列容器,即在存儲空間不足時,會自動申請更多的內存。使用此容器,在尾部增加或刪除元素的效率最高(時間複雜度爲 O(1) 常數階),在其它位置插入或刪除元素效率較差(時間複雜度爲 O(n) 線性階,其中 n 爲容器中元素的個數); - deque<T>(雙端隊列容器):
和 vector 非常相似,區別在於使用該容器不僅尾部插入和刪除元素高效,在頭部插入或刪除元素也同樣高效,時間複雜度都是 O(1) 常數階,但是在容器中某一位置處插入或刪除元素,時間複雜度爲 O(n) 線性階; - list<T>(鏈表容器):
是一個長度可變的、由 T 類型元素組成的序列,它以雙向鏈表的形式組織元素,在這個序列的任何地方都可以高效地增加或刪除元素(時間複雜度都爲常數階 O(1)),但訪問容器中任意元素的速度要比前三種容器慢,這是因爲 list<T> 必須從第一個元素或最後一個元素開始訪問,需要沿着鏈表移動,直到到達想要的元素。 - forward_list<T>(正向鏈表容器):
和 list 容器非常類似,只不過它以單鏈表的形式組織元素,它內部的元素只能從第一個元素開始訪問,是一類比鏈表容器快、更節省內存的容器。
注意,其實除此之外,stack<T> 和 queue<T> 本質上也屬於序列容器,只不過它們都是在 deque 容器的基礎上改頭換面而成,通常更習慣稱它們爲容器適配器,有關它們的介紹,會放到後續章節中。
下圖說明了可供使用的序列容器以及它們之間的區別。
轉載請註明文章來源:https://blog.csdn.net/y601500359/article/details/105409417
容器中常見的函數成員
表 2 展示了 array、vector 和 deque 容器的函數成員,它們中至少有兩個容器實現了同樣的函數成員。
表 2 array、vector 和 deque 容器的函數成員
列表中 - 表明對應的容器並沒有定義這個函數。
list 和 forward_list 容器彼此非常相似,forward_list 中包含了 list 的大部分成員函數,而未包含那些需要反向遍歷的函數。表 3 展示了 list 和 forward_list 的函數成員。
表 3 list 和 forward_list 的函數成員
函數成員 | 函數功能 | list<T> | forward_list<T> |
---|---|---|---|
begin() | 返回指向容器中第一個元素的迭代器。 | 是 | 是 |
end() | 返回指向容器最後一個元素所在位置後一個位置的迭代器。 | 是 | 是 |
rbegin() | 返回指向最後一個元素的迭代器。 | 是 | - |
rend() | 返回指向第一個元素所在位置前一個位置的迭代器。 | 是 | - |
cbegin() | 和 begin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。 | 是 | 是 |
before_begin() | 返回指向第一個元素前一個位置的迭代器。 | - | 是 |
cbefore_begin() | 和 before_begin() 功能相同,只不過在其基礎上,增加了 const 屬性,即不能用該指針修改元素的值。 | - | 是 |
cend() | 和 end() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素 | 。 是 | 是 |
crbegin() | 和 rbegin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。 | 是 | - |
crend() | 和 rend() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。 | 是 | - |
assign() | 用新元素替換原有內容。 | 是 | 是 |
operator=() | 複製同類型容器的元素,或者用初始化列表替換現有內容。 | 是 | 是 |
size() | 返回實際元素個數。 | 是 | - |
max_size() | 返回元素個數的最大值,這通常是一個很大的值,一般是 232-1,所以我們很少會用到這個函數。 | 是 | 是 |
resize() | 改變實際元素的個數。 | 是 | 是 |
empty() | 判斷容器中是否有元素,若無元素,則返回 true;反之,返回 false。 | 是 | 是 |
front() | 返回容器中第一個元素的引用。 | 是 | 是 |
back() | 返回容器中最後一個元素的引用。 | 是 - | |
push_back() | 在序列的尾部添加一個元素。 | 是 - | |
push_front() | 在序列的起始位置添加一個元素。 | 是 | 是 |
emplace() | 在指定位置直接生成一個元素。 | 是 - | |
emplace_after() | 在指定位置的後面直接生成一個元素。 | - | 是 |
emplace_back() | 在序列尾部生成一個元素。 | 是 | - |
cmplacc_front() | 在序列的起始位生成一個元索。 | 是 | 是 |
insert() | 在指定的位置插入一個或多個元素。 | 是 | - |
insert_after() | 在指定位置的後面插入一個或多個元素。 | - | 是 |
pop_back() | 移除序列尾部的元素。 | 是 | - |
pop_front() | 移除序列頭部的元素。 | 是 | 是 |
reverse() | 反轉容器中某一段的元素。 | 是 | 是 |
erase() | 移除指定位置的一個元素或一段元素。 | 是 - | |
erase_after() | 移除指定位置後面的一個元素或一段元素。 | - | 是 |
remove() | 移除所有和參數匹配的元素。 | 是 | 是 |
remove_if() | 移除滿足一元函數條件的所有元素。 | 是 | 是 |
unique() | 移除所有連續重複的元素。 | 是 | 是 |
clear() | 移除所有的元素,容器大小變爲 0。 | 是 | 是 |
swap() | 交換兩個容器的所有元素。 | 是 | 是 |
sort() | 對元素進行排序。 | 是 | 是 |
merge() | 合併兩個有序容器。 | 是 | 是 |
splice() | 移動指定位置前面的所有元素到另一個同類型的 list 中。 | 是 | - |
splice_after() | 移動指定位置後面的所有元素到另一個同類型的 list 中。 | - | 是 |
注意,大家沒有必要死記這些表,它們僅供參考。在深入瞭解到容器是如何組織元素以後,你會本能地知道哪個容器能使用哪些成員函數。