名稱空間
變體
操作

容器庫

來自 cppreference.com
< cpp

容器庫是類模板和演算法的通用集合,程式設計師可以輕鬆地實現常見的​​資料結構,如佇列、列表和堆疊。容器分為(直到 C++11)(自 C++11 起)

  • 序列容器,
  • 關聯容器,
  • 無序關聯容器,
(C++11 起)

每種容器都旨在支援一組不同的操作。

容器管理為其元素分配的儲存空間,並提供成員函式,以直接或透過迭代器(具有與指標類似屬性的物件)訪問它們。

大多數容器至少有幾個共同的成員函式,並共享功能。哪種容器最適合特定應用程式,不僅取決於所提供的功能,還取決於其在不同工作負載下的效率。

目錄

[編輯] 序列容器

序列容器實現可以按順序訪問的資料結構。

(C++11)
固定大小的原位連續陣列
(類模板) [編輯]
可變大小的連續陣列
(類模板) [編輯]
可變大小、固定容量、原地連續陣列
(類模板) [編輯]
(C++26)
重用已擦除元素的記憶體的集合
(類模板) [編輯]
雙端佇列
(類模板) [編輯]
單向連結串列
(類模板) [編輯]
雙向連結串列
(類模板) [編輯]

[編輯] 關聯容器

關聯容器實現可以快速搜尋(O(log n) 複雜度)的排序資料結構。

唯一鍵的集合,按鍵排序
(類模板) [編輯]
鍵值對集合,按鍵排序,鍵唯一
(類模板) [編輯]
鍵的集合,按鍵排序
(類模板) [編輯]
鍵值對的集合,按鍵排序
(類模板) [編輯]

[編輯] 無序關聯容器 (自 C++11 起)

無序關聯容器實現可以快速搜尋(O(1) 平均,O(n) 最壞情況複雜度)的無序(雜湊)資料結構。

由鍵雜湊的唯一鍵集合
(類模板) [編輯]
鍵值對的集合,按鍵雜湊,鍵是唯一的
(類模板) [編輯]
鍵的集合,按鍵雜湊
(類模板) [編輯]
鍵值對集合,按鍵雜湊
(類模板) [編輯]

[編輯] 容器介面卡

容器介面卡為序列容器提供不同的介面。

適配容器以提供堆疊(LIFO 資料結構)
(類模板) [編輯]
將容器適配為提供佇列(先進先出資料結構)
(類模板) [編輯]
適配容器以提供優先順序佇列
(類模板) [編輯]
(C++23)
適配容器以提供唯一鍵的集合,按鍵排序
(類模板) [編輯]
(C++23)
適配兩個容器以提供鍵值對集合,按唯一鍵排序
(類模板) [編輯]
適配容器以提供按鍵排序的鍵集合
(類模板) [編輯]
適配兩個容器以提供按鍵排序的鍵值對集合
(類模板) [編輯]

[編輯] 檢視 (自 C++20 起)

檢視提供靈活的功能,用於與非擁有元素陣列上的一維或多維檢視進行互動。

(C++20)
一個連續物件序列的非擁有檢視
(類模板) [編輯]
(C++23)
一個多維非擁有陣列檢視
(類模板) [編輯]

[編輯] 迭代器失效

只讀方法從不使迭代器或引用失效。修改容器內容的方法可能會使迭代器和/或引用失效,總結如下表。

分類 Container(容器) 插入後,是否... 擦除後,是否... 有條件地
迭代器有效? 引用有效? 迭代器有效? 引用有效?
序列容器 array 不適用 不適用
vector 不適用 插入更改了容量
在修改元素之前
(僅當容量未更改時才進行插入)
在修改元素處或之後
deque 是,除了已擦除的元素 修改了第一個或最後一個元素
僅修改了中間元素
list 是,除了已擦除的元素
forward_list 是,除了已擦除的元素
關聯容器 set
multiset
map
multimap
是,除了已擦除的元素
無序關聯容器 unordered_set
unordered_multiset
unordered_map
unordered_multimap
不適用 插入導致重新雜湊
是,除了已擦除的元素 未重新雜湊

此處,插入指任何向容器新增一個或多個元素的方法,而擦除指任何從容器中刪除一個或多個元素的方法。

(C++11 起)

除非另有說明(顯式或透過定義基於其他函式的函式),否則將容器作為引數傳遞給庫函式絕不會使容器內物件的迭代器失效或更改其值。

末尾迭代器值得特別提及。通常,此迭代器會像指向未擦除元素的普通迭代器一樣失效。因此 std::set::end 絕不會失效std::unordered_set::end 僅在重新雜湊時失效(自 C++11 起)std::vector::end 總是失效(因為它總是在修改的元素之後),依此類推。

有一個例外:刪除 std::deque 的最後一個元素的擦除確實使末尾迭代器失效,即使它不是容器的已擦除元素(或根本不是元素)。結合 std::deque 迭代器的一般規則,最終結果是唯一不使 std::deque::end 失效的修改操作是刪除第一個元素而不是最後一個元素的擦除。

執行緒安全

  1. 所有容器函式都可以由不同執行緒在不同容器上併發呼叫。更一般地,C++ 標準庫函式不會讀取其他執行緒可訪問的物件,除非這些物件透過函式引數(包括此指標)直接或間接可訪問。
  2. 所有 const 成員函式都可以由不同執行緒在同一容器上併發呼叫。此外,成員函式 begin()end()rbegin()rend()front()back()data()find()lower_bound()upper_bound()equal_range()at(),以及除關聯容器外的 operator[],線上程安全方面表現為 const(即,它們也可以由不同執行緒在同一容器上併發呼叫)。更一般地,C++ 標準庫函式不會修改物件,除非這些物件透過函式的非 const 引數(包括此指標)直接或間接可訪問。
  3. 同一容器中的不同元素可以由不同執行緒併發修改,但 std::vector<bool> 的元素除外(例如,一個 std::future 物件的 vector 可以從多個執行緒接收值)。
  4. 迭代器操作(例如,遞增迭代器)讀取但不修改底層容器,並且可以與同一容器上其他迭代器的操作、const 成員函式或元素的讀取併發執行。使任何迭代器失效的容器操作會修改容器,並且不能與現有迭代器上的任何操作併發執行,即使這些迭代器未失效。
  5. 同一容器的元素可以與未指定訪問這些元素的成員函式併發修改。更一般地,C++ 標準庫函式不會間接訪問透過其引數(包括容器的其他元素)可訪問的物件,除非其規範要求。
  6. 在任何情況下,容器操作(以及演算法或任何其他 C++ 標準庫函式)都可以在內部並行化,只要這不會改變使用者可見的結果(例如,std::transform 可以並行化,但 std::for_each 不能,因為它被指定按順序訪問序列的每個元素)。
(C++11 起)

[編輯] 函式表

注意:std::basic_string 不被標準視為容器,但由於其相似性,其行為很像容器。為方便起見,此處將其列為“偽容器”。

- C++03 中存在的函式
- 自 C++11 起存在的函式
- 自 C++17 起存在的函式
- 自 C++20 起存在的函式
- 自 C++23 起存在的函式

[編輯] 成員函式表

偽容器 序列容器 關聯容器 無序關聯容器 容器介面卡
標頭檔案 <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> 標頭檔案
Container(容器)
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Container(容器)
(建構函式)
basic_string
(隱式)
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
(建構函式)
(解構函式)
~basic_string
(隱式)
~vector
~deque
~forward_list
~list
~set
~multiset
~map
~multimap
~unordered_set
~unordered_multiset
~unordered_map
~unordered_multimap
~stack
~queue
~priority_queue
~flat_set
~flat_multiset
~flat_map
~flat_multimap
(解構函式)
operator=
operator=
(隱式)
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
assign
assign
assign
assign
assign
assign
assign
assign_range
assign_range
assign_range
assign_range
assign_range
assign_range
assign_range
迭代器
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
迭代器
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
元素
訪問
at
at
at
at
at
at
at
at
at
元素
訪問
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
data
data
data
data
data
front
front
front
front
front
front
front
front
top
front
back
back
back
back
back
back
top
back
back
容量
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
容量
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
resize
resize
resize
resize
resize
resize
resize
capacity
capacity
capacity
capacity
reserve
reserve
reserve
reserve
reserve
reserve
reserve
reserve
shrink_to_fit
shrink_to_fit
shrink_to_fit
shrink_to_fit
shrink_to_fit
修改器
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
修改器
insert
insert
insert
insert
insert_after
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert_range
insert_range
insert_range
insert_range
insert_range_after
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_or_assign
insert_or_assign
insert_or_assign
insert_or_assign
insert_or_assign
emplace
emplace
emplace
emplace_after
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
try_emplace
try_emplace
try_emplace
try_emplace
try_emplace
erase
erase
erase
erase
erase_after
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
push_front
push_front
push_front
push_front
push_front
prepend_range
prepend_range
prepend_range
prepend_range
prepend_range
emplace_front
emplace_front
emplace_front
emplace_front
emplace_front
pop_front
pop_front
pop_front
pop_front
pop
pop
pop_front
push_back
push_back
push_back
push_back
push_back
push
push
push
push_back
append_range
append_range
append_range
append_range
append_range
push_range
push_range
push_range
append_range
emplace_back
emplace_back
emplace_back
emplace_back
emplace
emplace
emplace
emplace_back
pop_back
pop_back
pop_back
pop_back
pop_back
pop
pop_back
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
extract [1]
extract
extract
extract
extract
extract
extract
extract
extract
extract
列表操作
splice
splice_after
splice
splice
列表操作
remove
remove
remove
remove
remove_if
remove_if
remove_if
remove_if
reverse
reverse
reverse
reverse
unique
unique
unique
unique
sort
sort
sort
sort
桶和雜湊
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
桶和雜湊
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
bucket_count
bucket_count
bucket_count
bucket_count
bucket_count
bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
bucket_size
bucket_size
bucket_size
bucket_size
bucket_size
bucket_size
bucket
bucket
bucket
bucket
bucket
bucket
load_factor
load_factor
load_factor
load_factor
load_factor
load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
rehash
rehash
rehash
rehash
rehash
rehash
查詢
count
count
count
count
count
count
count
count
count
count
count
count
count
count
查詢
find
find
find
find
find
find
find
find
find
find
find
find
find
find
find
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
觀察器
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
觀察器
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
hash_function
hash_function
hash_function
hash_function
hash_function
hash_function
key_eq
key_eq
key_eq
key_eq
key_eq
key_eq
分配器
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
分配器
介面卡
extract [2]
extract
extract
extract
extract
extract
介面卡
replace
replace
replace
replace
replace
replace
Container(容器)
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Container(容器)
標頭檔案 <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> 標頭檔案
偽容器 序列容器 關聯容器 無序關聯容器 容器介面卡
  • 注意:兩條不同 extract 行中的函式含義和語法不同
  1. 例如,node_type extract(const_iterator)node_type extract(Key&)
  2. 例如,container_type extract() &&

[編輯] 非成員函式表

偽容器 序列容器 關聯容器 無序關聯容器 容器介面卡
標頭檔案 <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> 標頭檔案
Container(容器)
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Container(容器)
非成員函式
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
非成員函式
operator!= (在 C++20 中移除)
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!= (在 C++20 中移除)
operator< (在 C++20 中移除)
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator< (在 C++20 中移除)
operator<= (在 C++20 中移除)
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<= (在 C++20 中移除)
operator> (在 C++20 中移除)
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator> (在 C++20 中移除)
operator>= (在 C++20 中移除)
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>= (在 C++20 中移除)
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
erase
erase
erase
erase
erase
erase
erase
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
Container(容器)
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Container(容器)
標頭檔案 <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> 標頭檔案
偽容器 序列容器 關聯容器 無序關聯容器 容器介面卡

<<=>>=!= 運算子分別從 operator<=>operator== 合成

(C++20 起)

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 51 C++98 容器迭代器可能被任意庫操作
失效
它們只在指定時
失效

[編輯] 另請參閱

C++ 命名要求

數值陣列、陣列掩碼和陣列切片
(類模板) [編輯]
儲存和操作字元序列
(類模板) [編輯]
只讀字串檢視
(類模板) [編輯]