サンプル コンテナー クラス
Note
このトピックは、C++ 標準ライブラリで使用されるコンテナーの例 (実際には機能しない) として、Microsoft C++ ドキュメントに含まれています。 詳細については、「C++ 標準ライブラリ コンテナー」を参照してください。
要素の可変長シーケンスを制御するオブジェクトを表します (通常は Ty 型)。 シーケンスは、実際のコンテナーに応じて、さまざまな方法で格納されます。
コンテナーのコンストラクターまたはメンバー関数がコンストラクター Ty(const Ty&) または関数 Ty::operator=(const Ty&) を呼び出す場合があります。 このような呼び出しで例外がスローされた場合、コンテナー オブジェクトは、その整合性を維持し、すべての例外をキャッチして再スローする必要があります。 コンテナー オブジェクトによっていずれか 1 つの例外がスローされた後に、コンテナー オブジェクトを安全にスワップ、消去、または破棄できます。 ただし、通常、それ以外の場合はコンテナー オブジェクトによって制御されるシーケンスの状態を予測できません。
その他の注意点:
式
~Tyが例外をスローする場合、コンテナー オブジェクトの結果の状態は未定義です。コンテナーがアロケーター オブジェクト al を格納し、al が
al.allocateへの呼び出しの結果以外として例外をスローする場合、コンテナー オブジェクトの結果の状態は未定義です。コンテナーが被制御シーケンスの順序付け方法を指定する関数オブジェクト comp を格納し、comp がいずれかの例外をスローする場合、コンテナー オブジェクトの結果の状態は未定義です。
C++ 標準ライブラリで定義されているコンテナー クラスは、次に説明するいくつかの追加要件を満たします。
コンテナーのクラス テンプレート list は、上記の例外が存在する場合でも、決定的かつ便利な動作を提供します。 たとえば、1 つまたは複数の要素の挿入時に例外がスローされた場合、コンテナーは変更されず、再度例外がスローされます。
C++ 標準ライブラリで定義されている "すべての" コンテナー クラスの場合、メンバー関数 insert、push_back、push_front への呼び出し中に例外がスローされると、コンテナーは変更されず、例外が再度スローされます。
C++ 標準ライブラリで定義されている "すべての"コンテナー クラスの場合、メンバー関数 pop_back、pop_front への呼び出し中に例外がスローされません。
メンバー関数 erase は、コピー操作 (割り当てまたはコピーの構築) が例外をスローする場合にのみ例外をスローします。
さらに、メンバー関数によって返される反復子のコピー中に例外はスローされません。
メンバー関数 swap は、C++ 標準ライブラリで定義されているすべてのコンテナー クラスに対する追加の確実性を実現します。
コンテナーがアロケーター オブジェクト al を格納し、
alがコピーされるときに例外をスローする場合にのみ、メンバー関数が例外をスローします。スワップされる被制御シーケンスの要素を指定する参照、ポインター、および反復子は有効なままです。
C++ 標準ライブラリで定義されたコンテナー クラスのオブジェクトが、Alloc 型の格納されているオブジェクトによって制御するシーケンスの記憶域の割り当ておよび解放を行います (これは通常、テンプレート パラメーターです)。 このようなアロケーター オブジェクトは、クラス allocator<Ty> のオブジェクトと同じ外部インターフェイスを持っている必要があります。 特に、Alloc は Alloc::rebind<value_type>::other と同じ型である必要があります。
C++ 標準ライブラリで定義されている "すべての" コンテナー クラスの場合、メンバー関数 Alloc get_allocator const; は格納されたアロケーター オブジェクトのコピーを返します。 コンテナー オブジェクトを代入しても、格納されているアロケーター オブジェクトはコピーされない点に注意してください。 すべてのコンストラクターは、コンストラクターにアロケーターのパラメーターが含まれていない場合、allocator に格納されている値を Alloc に初期化します。
C++ 標準に従って、C++ 標準ライブラリで定義されたコンテナー クラスは次を想定できます。
クラス
Allocのすべてのオブジェクトの比較結果が同じになります。型
Alloc::const_pointerはconst Ty *と同じです。型
Alloc::const_referenceはconst Ty&と同じです。型
Alloc::pointerはTy *と同じです。型
Alloc::referenceはTy&と同じです。
ただし、この実装では、コンテナーはこのような単純な想定を行いません。 このため、コンテナーはより意欲的なアロケーター オブジェクトと共に適切に動作します。
クラス
Allocのすべてのオブジェクトの比較結果が同じである必要はありません。 (記憶域の複数のプールを維持することができます。)型
Alloc::const_pointerはconst Ty *と同じである必要はありません。 (const ポインターには、クラスを指定できます。)型
Alloc::pointerはTy *と同じである必要はありません。 (ポインターには、クラスを指定できます。)
要件
ヘッダー: <sample container>