名前空間
変種
操作

C++ 名前付き要件: Container

From cppreference.com
 
 
C++ 名前付き要件
 

Container は、他のオブジェクトを格納し、格納しているオブジェクトが使用するメモリの管理を行うオブジェクトです。

目次

[編集] 要件

以下の型と値を考慮する

定義
T オブジェクト型
C T 型のオブジェクトを含むコンテナクラス
定義
u, v C 型または const C 型の値
mv C 型の値
cv const C 型の値
lhs, rhs C 型の左辺値
i, j C::iterator 型または const C::iterator 型の値

CContainer の要件を満たすのは、以下の型、ステートメント、および式が整形式であり、指定された意味論を持つ場合です。

[編集]

定義 要件
typename C::value_type T TCopyConstructible(C++11 まで) Erasable from C(C++11 以降).
typename C::reference T& 明示的な要件なし
typename C::const_reference const T&
typename C::iterator イテレータ型
  • C::iteratorLegacyForwardIterator であり、その 値型T です。
  • C::iteratorC::const_iterator に変換可能です。
typename C::const_iterator 定数イテレータ型 C::const_iteratorLegacyForwardIterator であり、その 値型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);

事前条件

もし vC 型の右辺値でなければ、TCCopyInsertable です。

(C++11以降)
線形
事後条件
  • もし v が左辺値なら、c == vtrue です。
  • もし v が右辺値、かつ cv が同じオブジェクトを参照しない(C++11 以降)ならば、c は、この構築の前に v が持っていた値と等しくなります。
注釈
  1. もし vC 型の右辺値で、かつ Cstd::array または std::inplace_vector の特殊化でない場合、その複雑性は定数です。

[編集]

Expression セマンティクス  計算量 
C() C 事後条件  C().empty()true です。 定数
C(v) C 事前条件

もし vC 型の右辺値でなければ、TCCopyInsertable です。

(C++11以降)
定数[1]
事後条件
  • もし v が左辺値なら、C(v) == vtrue です。
  • もし v が右辺値、かつ C(v)v が同じオブジェクトを参照しない(C++11 以降)ならば、C(v) は、この構築の前に v が持っていた値と等しくなります。
lhs = v C& 事後条件
  • もし v が左辺値なら、lhs == vtrue です。
  • もし v が右辺値、かつ lvv が同じオブジェクトを参照しない(C++11 以降)ならば、lhs は、この代入の前に v が持っていた値と等しくなります。
線形
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 効果 戻り値
u.size() == v.size() &&
    std::equal(u.begin(),
         u.end(), v.begin())
(C++14まで)
std::equal(u.begin(), u.end(),
           v.begin(), v.end())
(C++14以降)
.
線形[2]
u != v 効果 !(u == v) と同等です。
lhs.swap(rhs)

swap(lhs, rhs)

void 効果 lhsrhs の内容を交換します。 定数[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>
事前条件 Tthree_way_comparable をモデル化しているか、または operator<T 型の値と const T の間に定義された全順序関係であること。 線形
効果 std::lexicographical_compare_three_way
    (u.begin(), u.end(),
     v.begin(), v.end(),
     synth-three-way )
[5] を返します。
注釈
  1. もし vC 型の右辺値で、かつ Cstd::array または std::inplace_vector の特殊化である場合、その複雑性は線形です。
  2. もし u.size() != v.size()true ならば、その複雑性は定数です。
  3. もし Cstd::array または std::inplace_vector の特殊化である場合、その複雑性は線形です。
  4. 要素数は、コンストラクタ、挿入、削除の規則によって定義されます。これは std::distance(v.begin(), v.end()) の値に等しいです。
  5. もし std::lexicographical_compare_three_way に渡されたイテレータが ConstexprIterator ならば、その操作は constexpr 関数によって実装されます。

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 iteratorconst_iterator の型は比較不可能である可能性があった 比較可能であることが要求された
LWG 276 C++98 TCopyAssignable であることが要求されていた T
CopyConstructible
LWG 322 C++98 iteratorconst_iterator の値型が指定されていなかった T として指定された
LWG 774 C++98 swap(a, b) に関する要件がなかった 追加された
LWG 883 C++98 a.swap(b)swap(a, b) として定義されており、
循環定義につながった
交換として定義された
ab の値
LWG 1319 C++98 iteratorconst_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_typeDestructible であることが要求された C から Erasable であることが要求された

[編集] 関連項目

C++ ドキュメント : コンテナライブラリ
English 日本語 中文(简体) 中文(繁體)