名稱空間
變體
操作

std::vector

來自 cppreference.com
< cpp‎ | 容器
 
 
 
 
在標頭檔案 <vector> 中定義
template<

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template< class T >
    using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;

}
(2) (C++17 起)
1) std::vector 是一個封裝了動態大小陣列的序列容器。
2) std::pmr::vector 是一個使用多型分配器的別名模板。

元素是連續儲存的,這意味著不僅可以透過迭代器訪問元素,還可以透過元素常規指標的偏移量訪問。這意味著指向vector元素的指標可以傳遞給任何期望指向陣列元素的指標的函式。

vector的儲存是自動管理的,並根據需要擴充套件。Vector通常比靜態陣列佔用更多空間,因為分配了更多記憶體來處理未來的增長。這樣,vector在每次插入元素時不需要重新分配,而只在額外記憶體耗盡時才需要。可以使用capacity()函式查詢已分配記憶體的總量。透過呼叫shrink_to_fit()[1],可以將額外記憶體返回給系統。

重新分配通常是效能方面開銷大的操作。reserve()函式可以在預先知道元素數量的情況下消除重新分配。

vector上常見操作的複雜度(效率)如下:

  • 隨機訪問 - 常數 𝓞(1)
  • 在末尾插入或移除元素 - 攤銷常數 𝓞(1)
  • 插入或移除元素 - 與到vector末尾的距離呈線性關係 𝓞(n)

std::vector(對於bool以外的T)滿足ContainerAllocatorAwareContainer(C++11起)SequenceContainerContiguousContainer(C++17起)ReversibleContainer的要求。

std::vector的所有成員函式都是constexpr:可以在常量表達式的求值中建立和使用std::vector物件。

然而,std::vector物件通常不能是constexpr,因為任何動態分配的儲存都必須在同一常量表達式求值中釋放。

(C++20 起)
  1. 在libstdc++中,shrink_to_fit()在C++98模式下不可用

目錄

[編輯] 模板引數

T - 元素型別。
T必須滿足CopyAssignableCopyConstructible的要求。 (C++11 前)
對元素的要求取決於容器上實際執行的操作。通常,要求元素型別是完整型別並滿足Erasable的要求,但許多成員函式施加更嚴格的要求。 (C++11 起)
(C++17 前)

對元素的要求取決於容器上實際執行的操作。通常,要求元素型別滿足Erasable的要求,但許多成員函式施加更嚴格的要求。如果分配器滿足分配器完整性要求,則此容器(但不是其成員)可以用不完整元素型別例項化。

特性測試 標準 特性
__cpp_lib_incomplete_container_elements 201505L (C++17) 最小化不完整型別支援
(C++17 起)

[編輯]

Allocator - 用於獲取/釋放記憶體以及在該記憶體中構造/銷燬元素的分配器。型別必須滿足Allocator的要求。行為未定義(直到 C++20)程式格式錯誤(C++20起),如果Allocator::value_typeT不同。[編輯]

[編輯] 特化

標準庫為型別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

Allocator::pointer

(C++11 前)

std::allocator_traits<Allocator>::pointer

(C++11 起)
[編輯]
const_pointer

Allocator::const_pointer

(C++11 前)

std::allocator_traits<Allocator>::const_pointer

(C++11 起)
[編輯]
iterator

LegacyRandomAccessIteratorLegacyContiguousIteratorvalue_type

(C++20 前)

LegacyRandomAccessIteratorcontiguous_iteratorConstexprIteratorvalue_type

(C++20 起)
[編輯]
const_iterator

LegacyRandomAccessIteratorLegacyContiguousIteratorconst value_type

(C++20 前)

LegacyRandomAccessIteratorcontiguous_iteratorConstexprIteratorconst value_type

(C++20 起)
[編輯]
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) [編輯]
將一個範圍的值賦給容器
(public member function) [編輯]
返回關聯的分配器
(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) [編輯]
返回指向起始的逆向迭代器
(public member function) [編輯]
(C++11)
返回指向末尾的逆向迭代器
(public member function) [編輯]
容量
檢查容器是否為空
(public member function) [編輯]
返回元素數量
(public member function) [編輯]
返回元素的最大可能數量
(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) [編輯]
擦除元素
(public member function) [編輯]
新增元素到結尾
(public member function) [編輯]
就地構造元素於結尾
(public member function) [編輯]
新增一個元素範圍到結尾
(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++11)
固定大小的原位連續陣列
(類模板) [編輯]
雙端佇列
(類模板) [編輯]