命名空間
變體
動作

std::inplace_vector

出自 cppreference.com
< cpp‎ | container
 
 
 
 
定義於標頭檔 <inplace_vector>
template<

    class T,
    std::size_t N

> struct inplace_vector;
(C++26 起)

inplace_vector 是一種具有連續「就地」(inplace) 儲存空間且可動態調整大小的陣列。型別為 T 的元素儲存於物件本身內部,並進行正確的對齊。內部儲存空間的容量在編譯期固定,且等於 N

元素以連續方式儲存,這意味著不僅可以透過迭代器或隨機存取 operator[] 存取元素,還可以使用指向元素的常規指標偏移量來存取。inplace_vector 元素的指標可以傳遞給任何預期接收 C 陣列元素指標的函式。

inplace_vector 滿足 ContainerReversibleContainerContiguousContainerSequenceContainer 的模型,包括大部分的 序列容器可選操作需求,除了不提供 push_frontemplace_frontpop_frontprepend_range 成員函式。

對於任何正整數 Nstd::inplace_vector<T, N>::iteratorstd::inplace_vector<T, N>::const_iterator 皆滿足 ConstexprIterator 需求。

特例化版本 std::inplace_vector<T, 0>TriviallyCopyable 且為空的。 std::is_trivially_default_constructible_v<std::inplace_vector<T, 0>> 也為 true

std::inplace_vector<T, N> 的任何成員函式若嘗試執行導致插入超出容量 N 的操作,將會拋出 std::bad_alloc

inplace_vector 常見操作的複雜度如下:

  • 透過 operator[]at() 進行元素的隨機存取 – 常數時間:𝓞(1)
  • 在末端插入或移除元素 – 常數時間:𝓞(1)
  • 在末端插入或移除多個元素 – 與插入/移除的元素數量呈線性關係:𝓞(n)
  • 在開頭或中間插入或移除元素 – 與插入/移除的元素數量加上距離向量末端的距離呈線性關係:𝓞(n)

目錄

[編輯] 迭代器失效

std::inplace_vector 的迭代器失效保證與 std::vector 不同:

  • 移動 inplace_vector 會使所有迭代器失效;
  • 交換兩個 inplace_vector 會使所有迭代器失效(在交換過程中,迭代器將繼續指向同一個陣列元素,因此其值可能會改變)。

下列成員函式可能會使迭代器失效:operator=assignassign_rangeclearemplaceeraseinsertinsert_rangepop_backresize 以及 swap

下列成員函式僅會使 end 迭代器失效:append_rangeemplace_backpush_backtry_append_rangetry_emplace_backtry_push_backunchecked_emplace_back 以及 unchecked_push_back

[編輯] 模板參數

T - 元素型別。必須為 MoveConstructible 且可 MoveAssignable
N - 容量,即 inplace_vector 中元素的最大數量(可以是 0)。

[編輯] 成員型別

類型 定義
value_type T[編輯]
size_type std::size_t
difference_type std::ptrdiff_t
reference value_type&[編輯]
const_reference const value_type&[編輯]
pointer value_type*
const_pointer const value_type*
iterator 實作定義的 LegacyRandomAccessIteratorrandom_access_iterator,指向 value_type
const_iterator 實作定義的 LegacyRandomAccessIteratorConstexprIterator(自 C++26 起)random_access_iterator,指向 const value_type
reverse_iterator std::reverse_iterator<iterator>[編輯]
const_reverse_iterator std::reverse_iterator<const_iterator>[編輯]

[編輯] 成員函式

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

[編輯] 非成員函式

特化 std::swap 演算法
(函式範本) [編輯]
移除所有符合特定條件的元素
(函式樣板) [編輯]
依字典順序比較兩個 inplace_vector 的值
(函式模板) [edit]

[編輯] 註解

inplace_vector 中的元素數量可以動態變化,最高可達固定的容量,因為元素與 std::array 類似,儲存在物件本身內部。然而,與必須在實例化時建構所有元素的 C 陣列或 std::array 不同,inplace_vector 中的物件是在插入時才進行初始化的。

inplace_vector 在不希望使用動態記憶體配置的環境中非常有用。

功能測試巨集 數值 標準 功能
__cpp_lib_inplace_vector 202406L (C++26) std::inplace_vector:具有固定容量就地儲存空間且可動態調整大小的向量
__cpp_lib_constexpr_inplace_vector 202502L (C++26) constexpr 針對非平凡元素型別的 std::inplace_vector

[編輯] 範例

#include <algorithm>
#include <array>
#include <cassert>
#include <inplace_vector>
 
int main()
{
    std::inplace_vector<int, 4> v1{0, 1, 2};
    assert(v1.max_size() == 4);
    assert(v1.capacity() == 4);
    assert(v1.size() == 3);
    assert(std::ranges::equal(v1, std::array{0, 1, 2}));
    assert(v1[0] == 0);
    assert(v1.at(0) == 0);
    assert(v1.front() == 0);
    assert(*v1.begin() == 0);
    assert(v1.back() == 2);
    v1.push_back(3);
    assert(v1.back() == 3);
    assert(std::ranges::equal(v1, std::array{0, 1, 2, 3}));
    v1.resize(3);
    assert(std::ranges::equal(v1, std::array{0, 1, 2}));
    assert(v1.try_push_back(3) != nullptr);
    assert(v1.back() == 3);
    assert(v1.size() == 4);
    assert(v1.try_push_back(13) == nullptr); // no place
    assert(v1.back() == 3);
    assert(v1.size() == 4);
    v1.clear();
    assert(v1.size() == 0);
    assert(v1.empty());
}

[編輯] 參見

可調整大小的連續陣列
(類別模板) [編輯]
(C++11)
固定大小的原地 (inplace) 連續陣列
(類別模板) [編輯]
雙端隊列 (double-ended queue)
(類別模板) [編輯]

[編輯] 外部連結

1.  inplace_vectorP0843R14 (std::inplace_vector) 的參考實作。
2.  static_vector — Boost.Container 將就地向量實作為具有自身保證的獨立型別。
3.  fixed_vector — EASTL 透過額外的模板參數來實作就地向量。
4.  small_vector — Folly 同樣透過額外的模板參數來實作就地向量。
5.  stack_alloc — Howard Hinnant 的自訂配置器,可在 std::vector 之上模擬 std::inplace_vector
English Deutsch 日本語 中文(简体) 中文(繁體)