C++ named requirements: AllocatorAwareContainer (since C++11)
AllocatorAwareContainer は、 Container であり、 Allocator のインスタンスを保持し、そのすべてのメンバ関数でこのインスタンスを使用してメモリの割り当てと解放、およびそのメモリ内でのオブジェクトの構築と破棄を行う(そのようなオブジェクトは、コンテナの要素、ノード、または非順序コンテナの場合バケット配列などである) 、ただし std::basic_string の特殊化は要素の構築/破棄にアロケータを使用しない (C++23以降) 。
以下のルールがコンテナの構築に適用されます:
- AllocatorAwareContainer のコピーコンストラクタは、コピー元コンテナのアロケータに対して std:: allocator_traits < allocator_type > :: select_on_container_copy_construction を呼び出すことでアロケータのインスタンスを取得します。
- ムーブコンストラクタは、旧コンテナに属するアロケータからムーブ構築することでアロケータのインスタンスを取得します。
- その他のすべてのコンストラクタは const allocator_type & パラメータを受け取ります。
アロケータを置き換える唯一の方法は、コピー代入、ムーブ代入、およびswapです:
- コピー代入は、 std:: allocator_traits < allocator_type > :: propagate_on_container_copy_assignment :: value が true の場合のみアロケータを置換します。
- ムーブ代入は、 std:: allocator_traits < allocator_type > :: propagate_on_container_move_assignment :: value が true の場合のみアロケータを置換します。
- swap操作は、 std:: allocator_traits < allocator_type > :: propagate_on_container_swap :: value が true の場合のみアロケータを置換します。具体的には、非メンバー関数swapへの修飾なし呼び出しを通じてアロケータインスタンスを交換します( Swappable を参照)。swapがアロケータを伝播しない場合、異なるアロケータを持つ2つのコンテナを交換する動作は未定義です。
-
アクセサ
get_allocator()は、コンテナの構築時に使用されたアロケータ、または最新のアロケータ置換操作によってインストールされたアロケータのコピーを取得します。
唯一の例外は std:: basic_string < CharT,Traits,Allocator > :: assign であり、これはアロケータも伝播する可能性があります。
目次 |
要件
型が AllocatorAwareContainer を満たすのは、それが Container を満たし、かつ以下の型と値が与えられたときに、後述の表における意味論的要件と計算量要件が満たされる場合です:
| 型 | 定義 |
X
|
AllocatorAwareContainer 型 |
T
|
X
の
value_type
|
A
|
X
で使用されるアロケータ型
|
| 値 | 定義 |
| a , b |
型
X
の非const左辺値
|
| c | 型 const X の左辺値 |
| t |
型
X
の左辺値またはconst右辺値
|
| rv |
型
X
の非const右辺値
|
| m |
型
A
の値
|
型
| 名前 | 型 | 要件 |
|---|---|---|
| typename X :: allocator_type |
A
|
X::allocator_type::value_type
と
X::value_type
は同じである。
|
ステートメント
| ステートメント | セマンティクス | 計算量 | |
|---|---|---|---|
|
X u
;
X u = X ( ) ; |
事前条件 |
A
は
DefaultConstructible
である。
|
定数時間 |
| 事後条件 | u. empty ( ) かつ u. get_allocator ( ) == A ( ) がともに true である。 | ||
| X u ( m ) ; | 事後条件 | u. empty ( ) かつ u. get_allocator ( ) == m がともに true である。 | 定数時間 |
| X u ( t, m ) ; | 事前条件 |
T
は
CopyInsertable
であり、
X
に挿入可能である。
|
線形時間 |
| 事後条件 | u == t かつ u. get_allocator ( ) == m がともに true である。 | ||
| X u ( rv ) ; | 事後条件 |
|
定数時間 |
| X u ( rv, m ) ; | 事前条件 |
T
は
MoveInsertable
であり、
X
に挿入可能である。
|
|
| 事後条件 |
|
||
式
| 式 | 型 | 意味論 | 計算量 | |
|---|---|---|---|---|
| c. get_allocator ( ) |
A
|
直接的な意味論要件なし | 定数時間 | |
| a = t |
X&
|
事前条件 |
T
が
CopyInsertable
であり、かつ
CopyAssignable
であること
|
線形時間 |
| 事後条件 | a == t が true となる | |||
| a = rv |
X&
|
事前条件 |
アロケータがムーブ代入によって置き換えられない場合(
上記参照
)、
T
が
MoveInsertable
であり、かつ
MoveAssignable
であること
|
線形時間 |
| 効果 | a の既存の要素はすべてムーブ代入されるか破棄される | |||
| 事後条件 | a と rv が同じオブジェクトを参照していない場合、 a は代入前の rv の値と等しくなる | |||
| a. swap ( b ) | void | 効果 | a と b の内容を交換する | 定数時間 |
注記
AllocatorAwareContainer
は常に
std::
allocator_traits
<
A
>
::
construct
(
m, p, args
)
を呼び出して、型
T
のオブジェクトを
p
に
args
を使用して構築します。ここで
m
==
get_allocator
(
)
です。
デフォルトの
construct
は
std::allocator
内で
::
new
(
(
void
*
)
p
)
T
(
args
)
を呼び出します
(C++20まで)
std::allocator
には
construct
メンバーがなく、要素を構築する際に
std::
construct_at
(
p, args
)
が呼び出されます
(C++20から)
が、特殊化されたアロケータは異なる定義を選択する場合があります。
標準ライブラリ
すべての標準ライブラリの文字列型とコンテナ( std::array および std:: inplace_vector を除く)は AllocatorAwareContainer です:
|
文字シーケンスの格納と操作
(クラステンプレート) |
|
|
両端キュー
(クラステンプレート) |
|
|
(C++11)
|
単方向リンクリスト
(クラステンプレート) |
|
双方向リンクリスト
(クラステンプレート) |
|
|
サイズ変更可能な連続配列
(クラステンプレート) |
|
|
キー-値ペアのコレクション、キーでソート、キーは一意
(クラステンプレート) |
|
|
キー-値ペアのコレクション、キーでソート
(クラステンプレート) |
|
|
一意のキーのコレクション、キーでソート
(クラステンプレート) |
|
|
キーのコレクション、キーでソート
(クラステンプレート) |
|
|
(C++11)
|
キー-値ペアのコレクション、キーでハッシュ化、キーは一意
(クラステンプレート) |
|
(C++11)
|
キー-値ペアのコレクション、キーでハッシュ化
(クラステンプレート) |
|
(C++11)
|
一意のキーのコレクション、キーでハッシュ化
(クラステンプレート) |
|
(C++11)
|
キーのコレクション、キーでハッシュ化
(クラステンプレート) |
不具合報告
以下の動作変更欠陥報告書は、以前に公開されたC++標準に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2839 | C++11 | 標準コンテナの自己ムーブ代入は許可されていなかった | 許可されるが結果は未規定 |