序列容器以線性序列的方式儲存元素。它沒有對元素進行排序,元素的順序和儲存它們的順序相同。一般來說,有 5 種標準的序列容器,每種容器都具有不同的特性:
現在我們來說說序列式容器到底是什麼。
所謂序列容器,即以線性排列(類似普通陣列的儲存方式)來儲存某一指定型別(例如 int、double 等)的資料,需要特殊說明的是,該類容器並不會自動對儲存的元素按照值的大小進行排序。需要注意的是,序列容器只是一類容器的統稱,並不指具體的某個容器,序列容器大致包含以下幾類容器:
注意,其實除此之外,stack和 queue本質上也屬於序列容器,只不過它們都是在 deque 容器的基礎上改頭換面而成,通常更習慣稱它們為容器介面卡,有關它們的介紹,會放到後續章節中。
表 2 展示了 array、vector 和 deque 容器的函式成員,它們中至少有兩個容器實現了同樣的函式成員。
表 2 array、vector 和 deque 容器的函式成員
函式成員
函式功能
array
vector
deque
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
forward_list
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 中。-是
STL序列式容器之deque
deque是一種雙向開口的連續線性空間,所謂雙向是指可以在首尾兩端進行插入和刪除,邏輯結構如圖所示 deque和vector最大的差異在於deque可以在常數時間內對頭端進行插入和刪除操作,而且deque沒有容量的概念,隨時可以增加一段新的空間並鏈結起來。除非必要,應盡量使用vector而非dequ...
STL序列式容器之vector
序列式容器 序列式容器 可序列集群,其中的元素都可序,但未必有序。vector概述 vector的資料安排以及操作方式,與array非常相似。兩者的唯一差別在於空間的運用的靈話性,array 是靜態空間,一旦配置了就不能改變 要換個大 或小 一點的房子,可以,一切瑣細得由客戶端自己來 首先配置一塊新...
STL序列式容器之deque
deque概述 vector是單向開口的連續線性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作。vector當然也可以在頭尾兩端分別做元素的插入刪除操作 從技術上說 但是其頭部操作效率極差而無法被接受。deque和vector的最大差異,...