命名空間
變體
動作

std::vector

出自 cppreference.com
< cpp‎ | container
 
 
 
 
定義於標頭檔 <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 是一個使用多型配置器(polymorphic allocator)的別名樣板。

元素是連續儲存的,這意味著不僅可以透過迭代器存取元素,也可以使用指向元素的普通指標的偏移量來存取。這意味著指向 vector 元素的指標可以傳遞給任何預期指向陣列元素的指標的函式。

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

在效能方面,重新分配通常是昂貴的操作。如果預先知道元素的數量,可以使用 reserve() 函式來消除重新分配。

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

  • 隨機存取 - 常數時間 𝓞(1)
  • 在末端插入或移除元素 - 分攤常數時間 𝓞(1)
  • 插入或移除元素 - 與到 vector 末端的距離呈線性關係 𝓞(n)

std::vector(對於非 boolT)滿足 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)。此型別必須滿足 Allocator 的要求。若 Allocator::value_typeT 不相同,則行為未定義(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

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

指向 value_typeLegacyRandomAccessIteratorLegacyContiguousIterator

(直到 C++20)

指向 value_typeLegacyRandomAccessIteratorcontiguous_iteratorConstexprIterator

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

指向 const value_typeLegacyRandomAccessIteratorLegacyContiguousIterator

(直到 C++20)

指向 const value_typeLegacyRandomAccessIteratorcontiguous_iteratorConstexprIterator

(自 C++20 起)
[編輯]
reverse_iterator std::reverse_iterator<iterator>[編輯]
const_reverse_iterator std::reverse_iterator<const_iterator>[編輯]

[編輯] 成員函式

建構 vector
(公開成員函式) [編輯]
解構 vector
(公開成員函式) [編輯]
指派值給容器
(公開成員函式) [編輯]
指派值給容器
(公開成員函式) [編輯]
指派數值範圍給容器
(公開成員函式) [編輯]
回傳關聯的配置器
(公開成員函式) [編輯]
元素存取
存取指定元素,並進行邊界檢查
(公開成員函式) [編輯]
存取指定元素
(公開成員函式) [編輯]
存取第一個元素
(公開成員函式) [編輯]
存取最後一個元素
(公開成員函式) [編輯]
直接存取底層的連續儲存空間
(公開成員函式) [編輯]
迭代器
回傳指向起點的反覆器
(公開成員函式) [編輯]
(C++11)
回傳指向終點的反覆器
(公開成員函式) [編輯]
回傳指向起點的反向反覆器
(公開成員函式) [編輯]
(C++11)
回傳指向終點的反向反覆器
(公開成員函式) [編輯]
容量
檢查容器是否為空
(公開成員函式) [編輯]
回傳元素個數
(公開成員函式) [編輯]
回傳最大可能的元素個數
(公開成員函式) [編輯]
預留儲存空間
(公開成員函式) [編輯]
傳回目前已分配儲存空間中可容納的元素數量
(公開成員函式) [編輯]
透過釋放未使用的記憶體來減少記憶體使用量
(公開成員函式) [編輯]
修改器
清除內容
(公開成員函式) [編輯]
插入元素
(公開成員函式) [編輯]
插入數值範圍元素
(公開成員函式) [編輯]
(C++11)
原地建構元素
(公開成員函式) [編輯]
刪除元素
(公開成員函式) [編輯]
新增元素到結尾
(公開成員函式) [編輯]
原地建構一個元素到結尾
(公開成員函式) [編輯]
新增數值範圍元素到結尾
(公開成員函式) [編輯]
移除最後一個元素
(公開成員函式) [編輯]
更改儲存的元素個數
(公開成員函式) [編輯]
交換內容
(公開成員函式) [編輯]

[編輯] 非成員函式

(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(自 C++20 起)
按字典序比較兩個 vector 的值
(函式模板) [edit]
特化 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++11)
固定大小的原地 (inplace) 連續陣列
(類別模板) [編輯]
雙端隊列 (double-ended queue)
(類別模板) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)