名前付き要件: AllocatorAwareContainer
提供: cppreference.com
AllocatorAwareContainer は Allocator のインスタンスを保持し、すべてのメンバ関数はメモリを確保および解放するために、また、そのメモリにオブジェクト (コンテナの要素、ノード、非連想コンテナの場合はバケットの配列など) を確保および破棄するために、そのインスタンスを使用します。
以下のルールがコンテナの構築に適用されます。
- AllocatorAwareContainer のコピーコンストラクタは、コピーされようとしているコンテナのアロケータに対して std::allocator_traits<allocator_type>::select_on_container_copy_construction を呼ぶことで、アロケータのインスタンスを取得します。
- ムーブコンストラクタは、古いコンテナに所属するアロケータからムーブ構築することによって、アロケータのインスタンスを取得します。
- 他のすべてのコンストラクタはアロケータ引数を取ります。
アロケータを置き換える方法は、コピー代入、ムーブ代入、およびスワップだけです。
- コピー代入は std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value が true である場合にのみアロケータを置き換えます。
- ムーブ代入は std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value が true である場合にのみアロケータを置き換えます。
- スワップは std::allocator_traits<allocator_type>::propagate_on_container_swap::value が true である場合にのみアロケータを置き換えます。 具体的には、非メンバ関数 swap の非修飾の呼び出しを通してアロケータのインスタンスを交換します。 Swappable を参照してください。
ノート: propagate_on_container_swap
が false の場合、等しくないアロケータを持つ2つのコンテナのスワップは未定義動作です。
- アクセサ
get_allocator()
は、コンテナの構築に使用された、または最も最近のアロケータ置き換え操作によって設定された、アロケータのコピーを取得します。
目次 |
[編集] 要件
凡例 | |
X
|
コンテナの型 |
T
|
要素の型 |
A
|
T のためのアロケータ
|
a , b
|
X 型のオブジェクト (非 const 左辺値)
|
t
|
X 型のオブジェクト (左辺値または const 右辺値)
|
rv
|
X 型のオブジェクト (非 const 右辺値)
|
m
|
A 型のオブジェクト
|
Q
|
アロケータの型 |
式 | 戻り値の型 | 事前/要件 | 事後/効果 | 計算量 |
---|---|---|---|---|
allocator_type | A |
allocator_type::value_type は X::value_type と同じでなければならない | コンパイル時 | |
get_allocator() | A |
定数時間 | ||
X u; | A が DefaultConstructible である |
u.empty() == true && u.get_allocator() == A() | 定数時間 | |
X u(m); | u.empty() == true && u.get_allocator() == m | 定数時間 | ||
X u(t,m); | T が X に CopyInsertable である
|
u == t && u.get_allocator() == m | 線形時間 | |
X u(rv); | A のムーブコンストラクタは例外を投げてはならない
|
u は rv が構築前に持っていたのと同じ要素および等しいアロケータを持つ |
定数時間 | |
X u(rv,m); | T が X に MoveInsertable である
|
u の要素は rv の要素と同じまたはコピーであり、 u.get_allocator() == m である
|
m == rv.get_allocator() の場合は定数時間、そうでなければ線形時間 | |
a = t | X& | T は X に CopyInsertable であり、かつ CopyAssignable である |
a == t | 線形時間 |
a = rv | X& | アロケータがムーブ代入によって置き換えられない場合 (上を参照)、 T は X に MoveInsertable であり、かつ MoveAssignable である
|
a のすべての既存の要素はムーブ代入されるか破棄される。 a は rv が代入前に持っていた値と等しくなる。 |
線形時間 |
a.swap(b) | void | a と b の内容を交換する。 |
定数時間 |
[編集] その他の要件
- A
- T
- X
[編集] ノート
アロケータ対応コンテナは m == get_allocator() を使用して args
を渡して p
に A
型のオブジェクトを構築するために必ず std::allocator_traits<A>::construct(m, p, args) を呼びます。 std::allocator のデフォルトの construct
は ::new((void*)p) T(args) を呼びますが、特殊化されたアロケータは異なる定義を選ぶかもしれません。
[編集] 標準ライブラリ
std::array を除いたすべての標準ライブラリのコンテナは AllocatorAwareContainer です。