容器庫是類模板和演算法的通用集合,程式設計師可以輕鬆地實現常見的資料結構,如佇列、列表和堆疊。容器分為兩(直到 C++11)三(自 C++11 起)類
每種容器都旨在支援一組不同的操作。
容器管理為其元素分配的儲存空間,並提供成員函式,以直接或透過迭代器(具有與指標類似屬性的物件)訪問它們。
大多數容器至少有幾個共同的成員函式,並共享功能。哪種容器最適合特定應用程式,不僅取決於所提供的功能,還取決於其在不同工作負載下的效率。
[編輯] 序列容器
序列容器實現可以按順序訪問的資料結構。
|
固定大小的原位連續陣列 (類模板) [編輯] |
|
可變大小的連續陣列 (類模板) [編輯] |
|
可變大小、固定容量、原地連續陣列 (類模板) [編輯] |
|
重用已擦除元素的記憶體的集合 (類模板) [編輯] |
|
雙端佇列 (類模板) [編輯] |
|
單向連結串列 (類模板) [編輯] |
|
雙向連結串列 (類模板) [編輯] |
[編輯] 關聯容器
關聯容器實現可以快速搜尋(O(log n) 複雜度)的排序資料結構。
|
唯一鍵的集合,按鍵排序 (類模板) [編輯] |
|
鍵值對集合,按鍵排序,鍵唯一 (類模板) [編輯] |
|
鍵的集合,按鍵排序 (類模板) [編輯] |
|
鍵值對的集合,按鍵排序 (類模板) [編輯] |
[編輯] 無序關聯容器 (自 C++11 起)
無序關聯容器實現可以快速搜尋(O(1) 平均,O(n) 最壞情況複雜度)的無序(雜湊)資料結構。
|
由鍵雜湊的唯一鍵集合 (類模板) [編輯] |
|
鍵值對的集合,按鍵雜湊,鍵是唯一的 (類模板) [編輯] |
|
鍵的集合,按鍵雜湊 (類模板) [編輯] |
|
鍵值對集合,按鍵雜湊 (類模板) [編輯] |
[編輯] 容器介面卡
容器介面卡為序列容器提供不同的介面。
|
適配容器以提供堆疊(LIFO 資料結構) (類模板) [編輯] |
|
將容器適配為提供佇列(先進先出資料結構) (類模板) [編輯] |
|
適配容器以提供優先順序佇列 (類模板) [編輯] |
|
適配容器以提供唯一鍵的集合,按鍵排序 (類模板) [編輯] |
|
適配兩個容器以提供鍵值對集合,按唯一鍵排序 (類模板) [編輯] |
|
適配容器以提供按鍵排序的鍵集合 (類模板) [編輯] |
|
適配兩個容器以提供按鍵排序的鍵值對集合 (類模板) [編輯] |
[編輯] 檢視 (自 C++20 起)
檢視提供靈活的功能,用於與非擁有元素陣列上的一維或多維檢視進行互動。
|
一個連續物件序列的非擁有檢視 (類模板) [編輯] |
|
一個多維非擁有陣列檢視 (類模板) [編輯] |
[編輯] 迭代器失效
只讀方法從不使迭代器或引用失效。修改容器內容的方法可能會使迭代器和/或引用失效,總結如下表。
此處,插入指任何向容器新增一個或多個元素的方法,而擦除指任何從容器中刪除一個或多個元素的方法。
除非另有說明(顯式或透過定義基於其他函式的函式),否則將容器作為引數傳遞給庫函式絕不會使容器內物件的迭代器失效或更改其值。
末尾迭代器值得特別提及。通常,此迭代器會像指向未擦除元素的普通迭代器一樣失效。因此 std::set::end 絕不會失效,std::unordered_set::end 僅在重新雜湊時失效(自 C++11 起),std::vector::end 總是失效(因為它總是在修改的元素之後),依此類推。
有一個例外:刪除 std::deque 的最後一個元素的擦除確實使末尾迭代器失效,即使它不是容器的已擦除元素(或根本不是元素)。結合 std::deque 迭代器的一般規則,最終結果是唯一不使 std::deque::end 失效的修改操作是刪除第一個元素而不是最後一個元素的擦除。
執行緒安全
- 所有容器函式都可以由不同執行緒在不同容器上併發呼叫。更一般地,C++ 標準庫函式不會讀取其他執行緒可訪問的物件,除非這些物件透過函式引數(包括此指標)直接或間接可訪問。
- 所有 const 成員函式都可以由不同執行緒在同一容器上併發呼叫。此外,成員函式
begin() 、end() 、rbegin() 、rend() 、front() 、back() 、data() 、find() 、lower_bound() 、upper_bound() 、equal_range() 、at() ,以及除關聯容器外的 operator[] ,線上程安全方面表現為 const(即,它們也可以由不同執行緒在同一容器上併發呼叫)。更一般地,C++ 標準庫函式不會修改物件,除非這些物件透過函式的非 const 引數(包括此指標)直接或間接可訪問。 - 同一容器中的不同元素可以由不同執行緒併發修改,但 std::vector<bool> 的元素除外(例如,一個 std::future 物件的 vector 可以從多個執行緒接收值)。
- 迭代器操作(例如,遞增迭代器)讀取但不修改底層容器,並且可以與同一容器上其他迭代器的操作、const 成員函式或元素的讀取併發執行。使任何迭代器失效的容器操作會修改容器,並且不能與現有迭代器上的任何操作併發執行,即使這些迭代器未失效。
- 同一容器的元素可以與未指定訪問這些元素的成員函式併發修改。更一般地,C++ 標準庫函式不會間接訪問透過其引數(包括容器的其他元素)可訪問的物件,除非其規範要求。
- 在任何情況下,容器操作(以及演算法或任何其他 C++ 標準庫函式)都可以在內部並行化,只要這不會改變使用者可見的結果(例如,std::transform 可以並行化,但 std::for_each 不能,因為它被指定按順序訪問序列的每個元素)。
|
(C++11 起) |
[編輯] 函式表
注意:std::basic_string 不被標準視為容器,但由於其相似性,其行為很像容器。為方便起見,此處將其列為“偽容器”。
|
- C++03 中存在的函式 |
|
- 自 C++11 起存在的函式 |
|
- 自 C++17 起存在的函式 |
|
- 自 C++20 起存在的函式 |
|
- 自 C++23 起存在的函式 |
[編輯] 成員函式表
- 注意:兩條不同 extract 行中的函式含義和語法不同
- ↑ 例如,node_type extract(const_iterator) 或 node_type extract(Key&)
- ↑ 例如,container_type extract() &&
[編輯] 非成員函式表
< 、<= 、> 、>= 和 != 運算子分別從 operator<=> 和 operator== 合成。
|
(C++20 起) |
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 |
應用於 |
釋出時的行為 |
正確的行為 |
LWG 51
|
C++98 |
容器迭代器可能被任意庫操作 失效 |
它們只在指定時 失效 |
[編輯] 另請參閱
C++ 命名要求
|
數值陣列、陣列掩碼和陣列切片 (類模板) [編輯] |
|
儲存和操作字元序列 (類模板) [編輯] |
|
只讀字串檢視 (類模板) [編輯] |