名稱空間
變體
操作

std::inplace_vector

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

    class T,
    std::size_t N

> struct inplace_vector;
(C++26 起)

inplace_vector 是一個具有連續就地儲存的動態可變大小陣列。型別 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>可平凡複製的 且為空。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_backresizeswap

以下成員函式可能僅使 end 迭代器失效:append_rangeemplace_backpush_backtry_append_rangetry_emplace_backtry_push_backunchecked_emplace_backunchecked_push_back

[編輯] 模板引數

T - 元素型別。必須是 可移動構造可移動賦值 的。
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_iteratorvalue_type[編輯]
const_iterator 實現定義的 LegacyRandomAccessIteratorConstexprIterator(C++26 起)random_access_iteratorconst value_type[編輯]
reverse_iterator std::reverse_iterator<iterator>[編輯]
const_reverse_iterator std::reverse_iterator<const_iterator>[編輯]

[編輯] 成員函式

構造 inplace_vector
(public member function) [編輯]
銷燬 inplace_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) [編輯]
返回指向起始的逆向迭代器
(public member function) [編輯]
返回指向末尾的逆向迭代器
(public member function) [編輯]
大小和容量
檢查容器是否為空
(public member function) [編輯]
返回元素數量
(public member function) [編輯]
[靜態]
返回元素的最大可能數量
(public static member function) [編輯]
[靜態]
返回當前已分配儲存空間中可容納的元素數量
(public static member function) [編輯]
更改儲存的元素數量
(public member function) [編輯]
[靜態]
預留儲存空間
(public static member function) [編輯]
透過釋放未使用的記憶體來減少記憶體使用
(public static 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) [編輯]
新增一個元素範圍到結尾
(public member function) [編輯]
嘗試在末尾新增一系列元素
(public member function) [編輯]
清除內容
(public member function) [編輯]
擦除元素
(public member function) [編輯]
交換內容
(public member function) [編輯]

[編輯] 非成員函式

特化 std::swap 演算法
(函式模板) [編輯]
擦除所有滿足特定標準的元素
(函式模板) [編輯]
按字典序比較兩個 inplace_vector 的值
(函式模板) [編輯]

[編輯] 注意

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

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)
固定大小的原位連續陣列
(類模板) [編輯]
雙端佇列
(類模板) [編輯]

[編輯] 外部連結

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