C++ 名前付き要件: Container
From cppreference.com
Container は、他のオブジェクトを格納し、格納しているオブジェクトが使用するメモリの管理を行うオブジェクトです。
目次 |
[編集] 要件
以下の型と値を考慮する
| 型 | 定義 |
T
|
オブジェクト型 |
C
|
T 型のオブジェクトを含むコンテナクラス |
| 値 | 定義 |
| u, v | C 型または const C 型の値 |
| mv | C 型の値 |
| cv | const C 型の値 |
| lhs, rhs | C 型の左辺値 |
| i, j | C::iterator 型または const C::iterator 型の値 |
C が Container の要件を満たすのは、以下の型、ステートメント、および式が整形式であり、指定された意味論を持つ場合です。
[編集] 型
| 型 | 定義 | 要件 |
|---|---|---|
| typename C::value_type | T
|
T は CopyConstructible(C++11 まで) Erasable from C(C++11 以降). |
| typename C::reference | T&
|
明示的な要件なし |
| typename C::const_reference | const T& | |
| typename C::iterator | イテレータ型 |
|
| typename C::const_iterator | 定数イテレータ型 | C::const_iterator は LegacyForwardIterator であり、その 値型 は T です。 |
| typename C::difference_type | 符号付き整数型 | C::difference_type は、C::iterator および C::const_iterator の 差分型 と同じです。 |
| typename C::size_type | 符号なし整数型 | C::size_type は、C::difference_type のすべての非負値を表現するのに十分な大きさです。 |
[編集] ステートメント
| ステートメント | セマンティクス | 計算量 | |||
|---|---|---|---|---|---|
| C c;
C c = C(); |
事後条件 | c.empty() は true です。 | 定数 | ||
| C c(v);
C c = C(v); |
事前条件 |
|
線形 | ||
| 事後条件 |
| ||||
| 注釈 | |||||
| |||||
[編集] 式
| Expression | 型 | セマンティクス | 計算量 | |||||
|---|---|---|---|---|---|---|---|---|
| C() | C
|
事後条件 | C().empty() は true です。 | 定数 | ||||
| C(v) | C
|
事前条件 |
|
定数[1] | ||||
| 事後条件 |
| |||||||
| lhs = v | C&
|
事後条件 |
|
線形 | ||||
| v.~C() | void | 効果 | v のすべての要素を破棄し、取得したすべてのメモリを解放します。 | 線形 | ||||
| mv.begin() | C::iterator
|
効果 | mv の最初の要素を指すイテレータを返します。 | 定数 | ||||
| cv.begin() | C::const_iterator
|
効果 | cv の最初の要素を指すイテレータを返します。 | 定数 | ||||
| mv.end() | C::iterator
|
効果 | mv の末尾を過ぎたイテレータを返します。 | 定数 | ||||
| cv.end() | C::const_iterator
|
効果 | cv の末尾を過ぎたイテレータを返します。 | 定数 | ||||
| v.cbegin() (C++11以降) |
C::const_iterator
|
効果 | const_cast<const C&>(v).begin() を返します。 | 定数 | ||||
| v.cend() (C++11以降) |
C::const_iterator
|
効果 | const_cast<const C&>(v).end() を返します。 | 定数 | ||||
| i <=> j (C++20以降) |
std::strong_ordering | 制約 | この式は、C::iterator がランダムアクセスイテレータの要件を満たす場合にのみ、整形式であることが要求されます。 |
定数 | ||||
| u == v | bool | 効果 | 戻り値
|
線形[2] | ||||
| u != v | 効果 | !(u == v) と同等です。 | ||||||
| lhs.swap(rhs)
swap(lhs, rhs) |
void | 効果 | lhs と rhs の内容を交換します。 | 定数[3] | ||||
| v.size() | C::size_type
|
効果 | v の要素数を返します[4]。 | 定数 | ||||
| v.max_size() | C::size_type
|
効果 | C 型の最大のコンテナが格納できる要素数を返します。 |
定数 | ||||
| v.empty() | bool | 効果 | v.begin() == v.end() を返します。 | 定数 | ||||
| オプションのコンテナ要件 (一部のコンテナ型のみ提供) | ||||||||
| u <=> v (C++20以降) |
synth-three-way-result <C::value_type> |
事前条件 | T が three_way_comparable をモデル化しているか、または operator< が T 型の値と const T の間に定義された全順序関係であること。 |
線形 | ||||
| 効果 | std::lexicographical_compare_three_way (u.begin(), u.end(), v.begin(), v.end(), synth-three-way )[5] を返します。 | |||||||
| 注釈 | ||||||||
| ||||||||
式 i == j, i != j, i < j, i <= j, i >= j, i > j、および i - j において、もし i および/または j がそれぞれ C::const_iterator 型のイテレータに置き換えられた場合、意味論は同じままです。
[編集] コンテナのデータ競合
コンテナのスレッド安全性を参照してください。
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 179 | C++98 | iterator と const_iterator の型は比較不可能である可能性があった |
比較可能であることが要求された |
| LWG 276 | C++98 | T は CopyAssignable であることが要求されていた |
T はCopyConstructible |
| LWG 322 | C++98 | iterator と const_iterator の値型が指定されていなかった |
T として指定された |
| LWG 774 | C++98 | swap(a, b) に関する要件がなかった | 追加された |
| LWG 883 | C++98 | a.swap(b) が swap(a, b) として定義されており、 循環定義につながった |
交換として定義された a と b の値 |
| LWG 1319 | C++98 | iterator と const_iteratorマルチパス保証を持たない可能性があった |
満たすことが要求された 要件 LegacyForwardIterator |
| LWG 2114 (P2167R3) |
C++98 | 一部の関数の非 bool 型の返り値が許容されていた | 不許可になった |
| LWG 2182 | C++98 | reference およびconst_reference で示される型が不適切に指定されていた |
表現が改善された |
| LWG 2257 | C++98 | 2つのコンテナの比較に線形時間が必要だった サイズが異なっていても等しい |
定数時間のみを要求する この場合 |
| LWG 2263 | C++11 | LWG issue 179 の解決が C++11 で誤って削除された | 復元されました。 |
| LWG 2839 | C++11 | 標準コンテナの自己移動代入が許可されていなかった | 許可されたが、 結果は未指定 |
| N3346 | C++11 | C::value_type は Destructible であることが要求された |
C から Erasable であることが要求された |
[編集] 関連項目
| C++ ドキュメント : コンテナライブラリ
|