std::vector
| 定義於標頭檔 <vector> |
||
| template< class T, |
(1) | |
| namespace pmr { template< class T > |
(2) | (自 C++17 起) |
std::vector 是一個封裝動態大小陣列的序列容器。元素是連續儲存的,這意味著不僅可以透過迭代器存取元素,也可以使用指向元素的普通指標的偏移量來存取。這意味著指向 vector 元素的指標可以傳遞給任何預期指向陣列元素的指標的函式。
vector 的儲存空間由自動處理,並根據需要進行擴展。Vector 通常比靜態陣列佔用更多空間,因為分配了額外的記憶體來應對未來的增長。這樣,vector 就不需要在每次插入元素時都重新分配記憶體,而只需在額外的記憶體耗盡時才進行。可以使用 capacity() 函式查詢已分配記憶體的總量。額外的記憶體可以透過呼叫 shrink_to_fit()[1] 返還給系統。
在效能方面,重新分配通常是昂貴的操作。如果預先知道元素的數量,可以使用 reserve() 函式來消除重新分配。
Vector 常見操作的複雜度(效率)如下:
- 隨機存取 - 常數時間 𝓞(1)。
- 在末端插入或移除元素 - 分攤常數時間 𝓞(1)。
- 插入或移除元素 - 與到 vector 末端的距離呈線性關係 𝓞(n)。
std::vector(對於非 bool 的 T)滿足 Container、AllocatorAwareContainer(C++11 起)、SequenceContainer、ContiguousContainer(C++17 起) 以及 ReversibleContainer 的要求。
|
|
(自 C++20 起) |
目錄 |
[編輯] 樣板參數
| T | - | 元素的型別。
| ||||||||||||||
| 配置器 (Allocator) | - | 用於取得/釋放記憶體以及在該記憶體中建構/銷毀元素的配置器(Allocator)。此型別必須滿足 Allocator 的要求。若 Allocator::value_type 與 T 不相同,則行為未定義(C++20 前)程式格式錯誤(C++20 起)。 |
[編輯] 特化
標準程式庫為 bool 類型提供了 std::vector 的特化,該特化可能針對空間效率進行了優化。
| 空間效率高的動態位元集(bitset) (類別樣板特化) |
[編輯] 迭代器失效
| 作業 (Operations) | 失效情況 |
|---|---|
| 所有唯讀操作 | 從不。 |
| swap, std::swap | end() |
| clear, operator=, assign | 總是。 |
| reserve, shrink_to_fit | 若 vector 改變了容量,則全部失效。否則,均不失效。 |
| erase | 被刪除的元素以及其後的所有元素(包含 end())。 |
| push_back, emplace_back | 若 vector 改變了容量,則全部失效。若否,僅 end() 失效。 |
| insert, emplace | 若 vector 改變了容量,則全部失效。 若否,僅在插入點或插入點之後的元素(包含 end())失效。 |
| resize | 若 vector 改變了容量,則全部失效。若否,僅 end() 以及任何被刪除的元素失效。 |
| pop_back | 被刪除的元素以及 end()。 |
[編輯] 成員類型
| 成員型別 | 定義 | ||||
value_type
|
T | ||||
allocator_type
|
Allocator | ||||
size_type
|
無號整數型別(通常為 std::size_t) | ||||
difference_type
|
有號整數型別(通常為 std::ptrdiff_t) | ||||
reference
|
value_type& | ||||
const_reference
|
const value_type& | ||||
pointer
|
| ||||
const_pointer
|
| ||||
iterator
|
| ||||
const_iterator
|
| ||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[編輯] 成員函式
建構 vector(公開成員函式) | |
解構 vector(公開成員函式) | |
| 指派值給容器 (公開成員函式) | |
| 指派值給容器 (公開成員函式) | |
| (C++23) |
指派數值範圍給容器 (公開成員函式) |
| 回傳關聯的配置器 (公開成員函式) | |
元素存取 | |
| 存取指定元素,並進行邊界檢查 (公開成員函式) | |
| 存取指定元素 (公開成員函式) | |
| 存取第一個元素 (公開成員函式) | |
| 存取最後一個元素 (公開成員函式) | |
| 直接存取底層的連續儲存空間 (公開成員函式) | |
迭代器 | |
| (C++11) |
回傳指向起點的反覆器 (公開成員函式) |
| (C++11) |
回傳指向終點的反覆器 (公開成員函式) |
| (C++11) |
回傳指向起點的反向反覆器 (公開成員函式) |
| (C++11) |
回傳指向終點的反向反覆器 (公開成員函式) |
容量 | |
| 檢查容器是否為空 (公開成員函式) | |
| 回傳元素個數 (公開成員函式) | |
| 回傳最大可能的元素個數 (公開成員函式) | |
| 預留儲存空間 (公開成員函式) | |
| 傳回目前已分配儲存空間中可容納的元素數量 (公開成員函式) | |
| (DR*) |
透過釋放未使用的記憶體來減少記憶體使用量 (公開成員函式) |
修改器 | |
| 清除內容 (公開成員函式) | |
| 插入元素 (公開成員函式) | |
| (C++23) |
插入數值範圍元素 (公開成員函式) |
| (C++11) |
原地建構元素 (公開成員函式) |
| 刪除元素 (公開成員函式) | |
| 新增元素到結尾 (公開成員函式) | |
| (C++11) |
原地建構一個元素到結尾 (公開成員函式) |
| (C++23) |
新增數值範圍元素到結尾 (公開成員函式) |
| 移除最後一個元素 (公開成員函式) | |
| 更改儲存的元素個數 (公開成員函式) | |
| 交換內容 (公開成員函式) | |
[編輯] 非成員函式
| (於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(自 C++20 起) |
按字典序比較兩個 vector 的值(函式模板) |
| 特化 std::swap 演算法 (函式範本) | |
| 移除所有符合特定條件的元素 (函式樣板) |
推導指引 |
(自 C++17 起) |
[編輯] 備註
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | 容器的範圍建構與插入 |
[編輯] 範例
#include <iostream> #include <vector> int main() { // Create a vector containing integers std::vector<int> v = {8, 4, 5, 9}; // Add two more integers to vector v.push_back(6); v.push_back(9); // Overwrite element at position 2 v[2] = -1; // Print out the vector for (int n : v) std::cout << n << ' '; std::cout << '\n'; }
輸出
8 4 -1 9 6 9
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 69 | C++98 | 過去未要求 vector 元素的儲存空間必須連續 |
現在要求必須能互相比較 |
| LWG 230 | C++98 | T 未被要求為 CopyConstructible(型別為 T 的元素可能無法被建構) |
T 現在也被要求為 CopyConstructible |
| LWG 464 | C++98 | 存取空 vector 的底層儲存空間導致未定義行為 (UB) |
提供了 data 函式 |
[編輯] 參閱
| (C++26) |
可調整大小、固定容量、原地連續陣列 (類別模板) |
| (C++11) |
固定大小的原地 (inplace) 連續陣列 (類別模板) |
| 雙端隊列 (double-ended queue) (類別模板) |