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
|
実装定義
LegacyRandomAccessIterator
かつ
random_access_iterator
で
value_type
を指す
|
const_iterator
|
実装定義
LegacyRandomAccessIterator
、
ConstexprIterator
(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
を破棄する
(public member function) |
|
|
コンテナに値を代入する
(公開メンバ関数) |
|
|
コンテナに値を割り当てる
(公開メンバ関数) |
|
|
コンテナに値の範囲を割り当てる
(公開メンバ関数) |
|
要素アクセス |
|
|
指定された要素に境界チェック付きでアクセスする
(公開メンバ関数) |
|
|
指定された要素にアクセス
(公開メンバ関数) |
|
|
最初の要素にアクセスする
(public member function) |
|
|
最後の要素にアクセスする
(public member function) |
|
|
基となる連続ストレージへの直接アクセス
(公開メンバ関数) |
|
イテレータ |
|
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
終端へのイテレータを返す
(公開メンバ関数) |
|
|
先頭への逆方向イテレータを返す
(公開メンバ関数) |
|
|
末尾を指す逆イテレータを返す
(公開メンバ関数) |
|
サイズと容量 |
|
|
コンテナが空かどうかをチェックする
(public member function) |
|
|
要素数を返す
(公開メンバ関数) |
|
|
[static]
|
要素の最大可能数を返す
(public static member function) |
|
[static]
|
現在割り当てられているストレージに保持可能な要素数を返す
(public static member function) |
|
格納されている要素数を変更する
(public member function) |
|
|
[static]
|
ストレージを予約
(公開静的メンバー関数) |
|
[static]
|
未使用のメモリを解放してメモリ使用量を削減します
(公開静的メンバー関数) |
修飾子 |
|
|
要素を挿入する
(公開メンバ関数) |
|
|
要素の範囲を挿入します
(公開メンバー関数) |
|
|
要素をその場で構築する
(公開メンバ関数) |
|
|
末尾に要素をその場で構築する
(公開メンバ関数) |
|
|
末尾で要素をその場で構築しようと試みる
(公開メンバ関数) |
|
|
無条件に要素をその場で末尾に構築する
(公開メンバ関数) |
|
|
末尾に要素を追加する
(public member function) |
|
|
末尾に要素を追加しようと試みる
(公開メンバ関数) |
|
|
無条件に末尾に要素を追加する
(公開メンバー関数) |
|
|
最後の要素を削除します
(公開メンバ関数) |
|
|
要素の範囲を末尾に追加する
(公開メンバー関数) |
|
|
範囲の要素を末尾に追加しようと試みる
(公開メンバ関数) |
|
|
内容をクリアする
(公開メンバー関数) |
|
|
要素を削除する
(public member function) |
|
|
内容を交換する
(公開メンバ関数) |
|
非メンバー関数
|
(C++26)
|
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); // 空きがない 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
をエミュレート。
|