名前付き要件: 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 です。
- std::basic_string
- std::deque
- std::forward_list
- std::list
- std::vector
- std::map
- std::multimap
- std::set
- std::multiset
- std::unordered_map
- std::unordered_multimap
- std::unordered_set
- std::unordered_multiset