inplace_vector[meta header]
std[meta namespace]
class template[meta id-type]
cpp26[meta cpp]
namespace std {
template <class T , std::size_t N>
class inplace_vector ;
}
inplace_vectorはシーケンスコンテナの一種で、各要素は線形に、順序を保ったまま格納される。
inplace_vectorは容量をコンパイル時定数Nで固定する可変長配列として実装される。std::vector と異なり、要素はオブジェクト自身の内部ストレージ(スタック領域)に直接格納され、動的メモリ確保を一切行わない。容量は最大N要素であり、実行時にこれを超えて拡張することはできない。
inplace_vectorは連続コンテナ (contiguous container) であり、要素は隣接するメモリ上に配置される。添字による要素のランダムアクセスもできる。
std::array との主な違いは、inplace_vectorは要素数が可変であること、つまりデフォルト構築時に空であり、要素の追加・削除ができる点である。std::vector との主な違いは、ヒープではなくスタック配列であり、容量がコンパイル時に固定される点と、ムーブ・swap 操作の計算量がstd::array と同様に要素数に対して線形時間であり全イテレータが無効化される点である。
is_trivially_copyable_v<T>がtrueであるか、N == 0である場合、inplace_vector<T, N>自身もトリビアルにコピー可能である。
容量Nが0の場合、inplace_vector<T, 0>は空の型 (is_empty_v がtrue) となる。
サイズがNを超える操作(push_back() やinsert() など)はstd::bad_alloc 例外を送出する。容量超過時に例外ではなく戻り値で失敗を通知する失敗許容API (fallible API)(try_push_back() 、try_emplace_back() 、try_append_range() )や、事前条件として容量超過しないことを要求する事前条件チェックなしAPI (unchecked API)(unchecked_push_back() 、unchecked_emplace_back() )も提供される。
inplace_vectorはアロケータを使用しない。
inplace_vectorの全メンバ関数はconstexpr指定されており、定数式の中で使用できる。
各要素への添字アクセス(定数時間)
双方向への走査(線形時間)
末尾への要素の追加・削除(定数時間。ただし容量超過時は例外送出)
inplace_vectorにはクラステンプレートの推論補助が定義されていない。これは、初期化子リストやイテレータ範囲から要素型Tを推論できたとしても、コンパイル定数である容量Nを推論する方法がないためである。容量はコンパイル時定数として明示的に指定する必要がある。
// std::vector では推論補助が使える
std::vector v = {1 , 2 , 3 }; // OK: vector<int>
// std::inplace_vector では推論補助が使えない
// std::inplace_vector iv = {1, 2, 3}; // エラー: Nを推論できない
std::inplace_vector<int , 3 > iv = {1 , 2 , 3 }; // OK: 明示的に型と容量を指定
名前
説明
対応バージョン
begin
先頭の要素を指すイテレータを取得する
C++26
end
末尾の次を指すイテレータを取得する
C++26
cbegin
先頭の要素を指す読み取り専用イテレータを取得する
C++26
cend
末尾の次を指す読み取り専用イテレータを取得する
C++26
rbegin
末尾を指す逆イテレータを取得する
C++26
rend
先頭の前を指す逆イテレータを取得する
C++26
crbegin
末尾を指す読み取り専用逆イテレータを取得する
C++26
crend
先頭の前を指す読み取り専用逆イテレータを取得する
C++26
名前
説明
対応バージョン
operator[]
要素アクセス
C++26
at
要素アクセス
C++26
front
先頭要素への参照を取得する
C++26
back
末尾要素への参照を取得する
C++26
data
配列の先頭へのポインタを取得する
C++26
事前条件チェックなしの追加操作 (unchecked API)
名前
説明
対応バージョン
value_type
要素型 T
C++26
pointer
T*
C++26
const_pointer
const T*
C++26
reference
T&
C++26
const_reference
const T&
C++26
size_type
符号なし整数型 (通常はsize_t )
C++26
difference_type
符号付き整数型 (通常はptrdiff_t )
C++26
iterator
実装定義のランダムアクセスイテレータかつcontiguous_iterator
C++26
const_iterator
実装定義の読み取り専用ランダムアクセスイテレータかつcontiguous_iterator
C++26
reverse_iterator
reverse_iterator<iterator>
C++26
const_reverse_iterator
reverse_iterator<const_iterator>
C++26
名前
説明
対応バージョン
operator==
等値比較
C++26
bool operator!=(const inplace_vector& x, const inplace_vector& y);
非等値比較 (==により使用可能)
C++26
operator<=>
三方比較
C++26
bool operator<(const inplace_vector& x, const inplace_vector& y);
左辺が右辺より小さいかの判定を行う (<=>により使用可能)
C++26
bool operator<=(const inplace_vector& x, const inplace_vector& y);
左辺が右辺以下かの判定を行う (<=>により使用可能)
C++26
bool operator>(const inplace_vector& x, const inplace_vector& y);
左辺が右辺より大きいかの判定を行う (<=>により使用可能)
C++26
bool operator>=(const inplace_vector& x, const inplace_vector& y);
左辺が右辺以上かの判定を行う (<=>により使用可能)
C++26
名前
説明
対応バージョン
swap
2つのinplace_vectorオブジェクトを入れ替える
C++26
名前
説明
対応バージョン
erase
指定した値をもつ要素とその分の領域を、コンテナから削除する
C++26
erase_if
指定した条件に合致する要素とその分の領域を、コンテナから削除する
C++26
#include < print>
#include < inplace_vector>
int main ()
{
// int型を要素とし、最大容量5の固定容量可変長配列
std::inplace_vector<int , 5 > iv = {1 , 99 , 4 };
iv[1 ] = 3 ; // 1番目の要素を参照し、書き換える
iv.push_back (5 ); // 末尾に値5を追加
iv.insert (iv.begin () + 1 , 2 ); // 1番目に値2を挿入
int * p = iv.data (); // 内部表現のポインタを取得
std::size_t size = iv.size (); // 要素数を取得
// 各要素に対して操作を行う
for (int x : iv) {
std::println (" {}" , x);
}
}
iv[1][link inplace_vector/op_at.md]
iv.push_back[link inplace_vector/push_back.md]
iv.insert[link inplace_vector/insert.md]
iv.data()[link inplace_vector/data.md]
iv.size()[link inplace_vector/size.md]
失敗許容API (fallible API) の使用例
#include < print>
#include < inplace_vector>
int main ()
{
std::inplace_vector<int , 3 > iv = {1 , 2 , 3 };
// 容量が満杯なので、try_push_backはnullptrを返す
int * result = iv.try_push_back (4 );
if (result == nullptr ) {
std::println (" 容量超過: 要素を追加できません" );
}
// unchecked_push_backは容量チェックを行わない(容量超過は未定義動作)
// iv.unchecked_push_back(4); // 未定義動作!
std::println (" size: {}" , iv.size ());
}
iv.try_push_back[link inplace_vector/try_push_back.md]
iv.size()[link inplace_vector/size.md]