Namespaces
Variants

C++ named requirements: Container

From cppreference.net
C++ named requirements

コンテナは、他のオブジェクトを格納し、その中に含まれるオブジェクトが使用するメモリの管理を担当するために使用されるオブジェクトです。

目次

要件

以下の型と値が与えられた場合:

定義
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 から C (C++11以降) である。
typename C :: reference T& 明示的な要件なし
typename C :: const_reference const T &
typename C :: iterator イテレータ型
typename C :: const_iterator 定数イテレータ型 C::const_iterator LegacyForwardIterator であり、その value type T である。
typename C :: difference_type 符号付き整数型 C::difference_type C::iterator および C::const_iterator difference type と同じである。
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 ) ;

事前条件

v が型 C のrvalueでない場合、 T C CopyInsertable でなければならない。

(C++11以降)
線形時間 [1]
事後条件
  • v がlvalueの場合、 c == v true である。
  • v がrvalueの場合 、かつ c v が同じオブジェクトを参照していない場合 (C++11以降) c はこの構築前に v が持っていた値と等しい。
注記
  1. v が型 C のrvalueであり、かつ C std::array または std::inplace_vector の特殊化でない場合、計算量は定数時間である。

意味論 計算量
C ( ) C 事後条件 C ( ) . empty ( ) true です。 定数
C ( v ) C 事前条件

v が型 C の右辺値でない場合、 T CopyInsertable でなければならない( C にコピー挿入可能であること)。

(C++11以降)
定数時間 [1]
事後条件
  • v が左辺値の場合、 C ( v ) == v true となる。
  • v が右辺値 であり、かつ C ( v ) v が同じオブジェクトを参照しない場合 (C++11以降) C ( v ) はこの構築前に v が持っていた値と等しい。
lhs = v C& 事後条件
  • v が左辺値の場合、 lhs == v true となる。
  • v が右辺値 であり、かつ lv v が同じオブジェクトを参照していない場合 (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 効果 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] を返す
注記
  1. v が型 C の右辺値であり、 C std::array または std::inplace_vector の特殊化である場合、計算量は線形である。
  2. u. size ( ) ! = v. size ( ) true である場合、計算量は定数である。
  3. C std::array または std::inplace_vector の特殊化である場合、計算量は線形である。
  4. 要素数はコンストラクタ、挿入、削除の規則によって定義される。これは std:: distance ( v. begin ( ) , v. end ( ) ) の値と等しい。
  5. std::lexicographical_compare_three_way に渡されるイテレータが ConstexprIterator s である場合、操作は 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 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++ documentation for Containers library
日本語訳:
C++ documentation Containers library
変更点: - 「for」を「の」に翻訳 - HTMLタグ、属性、C++固有の用語("C++ documentation"、"Containers library")は翻訳せず保持 - 元のフォーマットを完全に維持