STL之序列式容器(一)、什麼是序列式容器

前言

序列容器以線性序列的方式存儲元素。它沒有對元素進行排序,元素的順序和存儲它們的順序相同。一般來說,有 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 容器的函數成員

函數成員 函數功能 array<T,N> vector<T> deque<T>
begin() 返回指向容器中第一個元素的迭代器。
end() 返回指向容器最後一個元素所在位置後一個位置的迭代器,通常和 begin() 結合使用。
rbegin() 返回指向最後一個元素的迭代器。
rend() 返回指向第一個元素所在位置前一個位置的迭代器。
cbegin() 和 begin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
cend() 和 end() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crbegin() 和 rbegin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crend() 和 rend() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
assign() 用新元素替換原有內容。 -
operator=() 複製同類型容器的元素,或者用初始化列表替換現有內容。
size() 返回實際元素個數。
max_size() 返回元素個數的最大值。這通常是一個很大的值,一般是 232-1,所以我們很少會用到這個函數。
capacity() 返回當前容量。 - -
empty() 判斷容器中是否有元素,若無元素,則返回 true;反之,返回 false。
resize() 改變實際元素的個數。 -
shrink _to_fit() 將內存減少到等於當前元素實際所使用的大小。 -
front() 返回第一個元素的引用。
back() 返回最後一個元素的引用。
operator 使用索引訪問元素。
at() 使用經過邊界檢査的索引訪問元素。
push_back() 在序列的尾部添加一個元素。 -
insert() 在指定的位置插入一個或多個元素。 -
emplace() 在指定的位置直接生成一個元素。 -
emplace_back() 在序列尾部生成一個元素。 -
pop_back() 移出序列尾部的元素。 -
erase() 移出一個元素或一段元素。 -
clear() 移出所有的元素,容器大小變爲 0。 -
swap() 交換兩個容器的所有元素。
data() 返回指向容器中第一個元素的指針。 -

列表中 - 表明對應的容器並沒有定義這個函數。

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 中。 -

注意,大家沒有必要死記這些表,它們僅供參考。在深入瞭解到容器是如何組織元素以後,你會本能地知道哪個容器能使用哪些成員函數。

參考來源:http://c.biancheng.net/view/409.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章