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的要求。行為未定義(直到 C++20)程式格式錯誤(C++20起),如果Allocator::value_type 與T 不同。 |
[編輯] 特化
標準庫為型別bool提供了std::vector
的特化,該特化可能針對空間效率進行了最佳化。
節省空間的動態位集 (類模板特化) |
[編輯] 迭代器失效
操作 | 失效 |
---|---|
所有隻讀操作 | 永不。 |
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 (public member function) | |
析構 vector (public member function) | |
將值賦給容器 (public member function) | |
將值賦給容器 (public member function) | |
(C++23) |
將一個範圍的值賦給容器 (public member function) |
返回關聯的分配器 (public member function) | |
元素訪問 | |
訪問指定的元素,帶邊界檢查 (public member function) | |
訪問指定的元素 (public member function) | |
訪問第一個元素 (public member function) | |
訪問最後一個元素 (public member function) | |
直接訪問底層連續儲存 (public member function) | |
迭代器 | |
(C++11) |
返回指向起始的迭代器 (public member function) |
(C++11) |
返回指向末尾的迭代器 (public member function) |
(C++11) |
返回指向起始的逆向迭代器 (public member function) |
(C++11) |
返回指向末尾的逆向迭代器 (public member function) |
容量 | |
檢查容器是否為空 (public member function) | |
返回元素數量 (public member function) | |
返回元素的最大可能數量 (public member function) | |
預留儲存空間 (public member function) | |
返回當前已分配儲存空間中可容納的元素數量 (public member function) | |
(DR*) |
透過釋放未使用的記憶體來減少記憶體使用 (public member function) |
修改器 | |
清除內容 (public member function) | |
插入元素 (public member function) | |
(C++23) |
插入元素範圍 (public member function) |
(C++11) |
就地構造元素 (public member function) |
擦除元素 (public member function) | |
新增元素到結尾 (public member function) | |
(C++11) |
就地構造元素於結尾 (public member function) |
(C++23) |
新增一個元素範圍到結尾 (public member function) |
移除末元素 (public member function) | |
更改儲存的元素數量 (public member function) | |
交換內容 (public member function) |
[編輯] 非成員函式
(在 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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 69 | C++98 | 未要求 vector 元素儲存的連續性 |
需要 |
LWG 230 | C++98 | T 不要求為可複製構造 (CopyConstructible)(型別 T 的元素可能無法被構造) |
T 也要求為可複製構造 (CopyConstructible) |
LWG 464 | C++98 | 訪問空 vector 的底層儲存導致未定義行為 |
提供了 data 函式 |
[編輯] 另請參閱
(C++26) |
可變大小、固定容量、原地連續陣列 (類模板) |
(C++11) |
固定大小的原位連續陣列 (類模板) |
雙端佇列 (類模板) |