Namespaces
Variants

std:: inplace_vector

From cppreference.net
ヘッダーで定義 <inplace_vector>
template <

class T,
std:: size_t N

> struct inplace_vector ;
(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]
ストレージを予約
(公開静的メンバー関数)
未使用のメモリを解放してメモリ使用量を削減します
(公開静的メンバー関数)
修飾子
要素を挿入する
(公開メンバ関数)
要素の範囲を挿入します
(公開メンバー関数)
要素をその場で構築する
(公開メンバ関数)
末尾に要素をその場で構築する
(公開メンバ関数)
末尾で要素をその場で構築しようと試みる
(公開メンバ関数)
無条件に要素をその場で末尾に構築する
(公開メンバ関数)
末尾に要素を追加する
(public member function)
末尾に要素を追加しようと試みる
(公開メンバ関数)
無条件に末尾に要素を追加する
(公開メンバー関数)
最後の要素を削除します
(公開メンバ関数)
要素の範囲を末尾に追加する
(公開メンバー関数)
範囲の要素を末尾に追加しようと試みる
(公開メンバ関数)
内容をクリアする
(公開メンバー関数)
要素を削除する
(public member function)
内容を交換する
(公開メンバ関数)

非メンバー関数

std::swap アルゴリズムを特殊化する
(関数テンプレート)
特定の条件を満たすすべての要素を削除する
(関数テンプレート)
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 をエミュレート。