std::inplace_vector
| ヘッダ <inplace_vector> で定義 |
||
| template< class T, |
(C++26以降) | |
inplace_vectorは、連続したインプレースストレージを持つ、動的にリサイズ可能な配列です。型Tの要素は、オブジェクト自体の中に格納され、適切にアラインメントされます。内部ストレージの容量はコンパイル時に固定され、Nと等しくなります。
要素は連続して格納されます。これは、イテレータやランダムアクセスoperator[]を通してだけでなく、要素への通常のポインタからのオフセットを使っても要素にアクセスできることを意味します。inplace_vectorの要素へのポインタは、C配列の要素へのポインタを期待するあらゆる関数に渡すことができます。
inplace_vectorはコンテナ (Container)、リバーシブルコンテナ (ReversibleContainer)、連続コンテナ (ContiguousContainer)、シーケンスコンテナ (SequenceContainer) をモデル化しており、シーケンスコンテナのオプション要件のほとんどを含みますが、push_front、emplace_front、pop_front、prepend_rangeメンバ関数は提供されません。
任意の正のNに対して、std::inplace_vector<T, N>::iteratorとstd::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をムーブすると、すべてのイテレータが無効になります。- 2つの
inplace_vectorをスワップすると、すべてのイテレータが無効になります(スワップ中、イテレータは同じ配列要素を指し続けますが、その値は変わる可能性があります)。
以下のメンバ関数は、イテレータを無効化する可能性があります: operator=, assign, assign_range, clear, emplace, erase, insert, insert_range, pop_back, resize, swap。
以下のメンバ関数は、endイテレータのみを無効化する可能性があります: append_range, emplace_back, push_back, try_append_range, try_emplace_back, try_push_back, unchecked_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
|
value_typeへの、処理系定義のLegacyRandomAccessIteratorであり、random_access_iteratorでもある |
const_iterator
|
const value_typeへの、処理系定義のLegacyRandomAccessIterator、ConstexprIterator(C++26から)であり、random_access_iteratorでもある |
reverse_iterator
|
std::reverse_iterator<iterator> |
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[編集] メンバ関数
inplace_vectorを構築する(公開メンバ関数) | |
inplace_vectorを破棄する(公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| コンテナに値の範囲を代入する (公開メンバ関数) | |
要素アクセス | |
| 境界チェック付きで指定された要素にアクセスする (public メンバ関数) | |
| 指定された要素にアクセスする (public メンバ関数) | |
| 最初の要素にアクセスする (public メンバ関数) | |
| 最後の要素にアクセスする (public メンバ関数) | |
| 基底となる連続ストレージに直接アクセスする (public メンバ関数) | |
イテレータ | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 末尾へのイテレータを返す (public メンバ関数) | |
| 先頭への逆イテレータを返す (public メンバ関数) | |
| 末尾への逆イテレータを返す (public メンバ関数) | |
サイズと容量 | |
| コンテナが空かどうかをチェックする (public メンバ関数) | |
| 要素数を返す (public メンバ関数) | |
| [static] |
可能な最大要素数を返す (public static member function) |
| [static] |
現在確保されているストレージに保持できる要素数を返す (public static member function) |
| 格納されている要素の数を変更する (公開メンバ関数) | |
| [static] |
ストレージを予約する (public static member function) |
| [static] |
未使用のメモリを解放してメモリ使用量を削減する (public static member function) |
変更 | |
| 要素を挿入する (公開メンバ関数) | |
| 要素の範囲を挿入する (公開メンバ関数) | |
| 要素を直接構築する (公開メンバ関数) | |
| 末尾に要素を直接構築する (公開メンバ関数) | |
| 末尾に要素を直接構築しようと試みる (public member function) | |
| 末尾に要素を無条件で直接構築する (public member function) | |
| 末尾に要素を追加する (公開メンバ関数) | |
| 末尾に要素を追加しようと試みる (public member function) | |
| 末尾に要素を無条件で追加する (public member function) | |
| 最後の要素を削除する (公開メンバ関数) | |
| 末尾に要素の範囲を追加する (公開メンバ関数) | |
| 末尾に要素の範囲を追加しようと試みる (public member function) | |
| 内容をクリアする (公開メンバ関数) | |
| 要素を削除する (公開メンバ関数) | |
| 内容を交換する (public メンバ関数) | |
[編集] 非メンバ関数
| std::swap アルゴリズムを特殊化する (関数テンプレート) | |
| 特定の基準を満たすすべての要素を削除する (関数テンプレート) | |
| (C++26) |
2つのinplace_vectorの値を辞書式比較する(関数テンプレート) |
[編集] ノート
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) |
固定サイズのインプレースな連続配列 (クラステンプレート) |
| 両端キュー (クラステンプレート) |
[編集] 外部リンク
| 1. | inplace_vector — P0843R14 (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をエミュレートするカスタムアロケータ。 |