Namespaces
Variants

C++ named requirements: SequenceContainer

From cppreference.net
C++ named requirements

SequenceContainer は、同じ型のオブジェクトを線形配置で格納する Container です。

目次

要件

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

定義
C シーケンスコンテナクラス
T C の要素型
A C のアロケータ型:
  • C::allocator_type が存在する場合、
  • それ以外の場合 std:: allocator < T >
R (C++23以降) container-compatible-range  <T> をモデル化する型
Args (C++11以降) テンプレートパラメータパック
Iter C::iterator
Ref C::reference
CRef C::const_reference
定義
v C の値
cv const C の値
i , j LegacyInputIterator s であり、 [ i , j ) 有効な範囲 であり、イテレータが C::value_type に暗黙的に変換可能な要素を参照するもの
rg (C++23以降) R の値
il (C++11以降) std:: initializer_list < C :: value_type > の値
n C::size_type の値
p v への 有効なconstイテレータ
q v への 有効なデリファレンス可能な constイテレータ
q1 , q2 v へのconstイテレータであり、 [ q1 , q2 ) が有効な範囲であるもの
t C::value_type (C++11以前) 左辺値 またはconst右辺値 (C++11以降)
rv (C++11以降) C::value_type の非const右辺値
args (C++11以降) パターン Arg&& を持つ関数パラメータパック

C は以下の条件をすべて満たす場合、 SequenceContainer の要件を満たします:

  • C Container の要件を満たす。
  • 以下の文および式は適切に形成され、指定された意味を持つ:
翻訳内容: - `Containers` → `コンテナ` - `(since C++11)` → `(C++11以降)` 以下の要素は翻訳していません: - HTMLタグと属性 - ` `タグ内のC++関連用語(`deque`, `list`, `forward_list`) - ` `内のC++コード(`v.push_front(rv)`, `void`) - その他のC++固有の用語 変更点: - 「Containers」を「コンテナ」に翻訳 - HTMLタグ、属性、 タグ内のC++用語はすべて原文のまま保持 - 書式設定と構造は完全に維持
基本操作
(標準ライブラリのすべてのシーケンスコンテナで必須 標準ライブラリ を除く std::array (C++11以降) )
ステートメント セマンティクス [1]
C c ( n, t ) ; 効果 シーケンスコンテナを構築し、 n 個の t のコピーを保持する。
事前条件

T CopyInsertable であり、 C に挿入可能であること。

(C++11以降)
事後条件 std:: distance ( c. begin ( ) , c. end ( ) ) n である。
C c ( i, j ) ; 効果 範囲 [ i , j ) と要素ごとに等しいシーケンスコンテナを構築する。
  • 範囲 [ i , j ) 内の各イテレータは正確に1回デリファレンスされる。
事前条件

T EmplaceConstructible であり、 C に対して * i から構築可能であること。

(C++11以降)
事後条件 std:: distance ( c. begin ( ) , c. end ( ) ) std:: distance ( i, j ) である。
意味論
C ( std:: from_range , rg )
(C++23以降)
C 効果 範囲 rg と等しいシーケンスコンテナを要素ごとに構築する。
  • 範囲 rg 内の各イテレータは正確に1回デリファレンスされる。
事前条件 T EmplaceConstructible であり、 X * ranges:: begin ( rg ) から構築可能であること。
事後条件 std:: distance ( begin ( ) , end ( ) ) ranges:: distance ( rg ) と等しい。
C ( il )
(C++11以降)
C C ( il. begin ( ) , il. end ( ) ) と同等。
v = il
(C++11以降)
C& 効果 il で表される範囲を v に代入する。 [2]
戻り値 * this
事前条件 T CopyInsertable であり、 C への挿入可能かつ CopyAssignable であること。
事後条件 v の既存要素は破棄されるか、代入される。
v. emplace ( p, args )
(C++11以降)
Iter 効果 T 型のオブジェクトを、 std:: forward < Args > ( args ) ... で構築して p の前に挿入する。
戻り値 args から v 内に構築された新しい要素を指すイテレータ。
事前条件 T EmplaceConstructible であり、 C args から構築可能であること。
v. insert ( p, t ) Iter 効果 p の前に t のコピーを挿入する。
戻り値 v に挿入された t のコピーを指すイテレータ。
事前条件

T CopyInsertable であり、 C に挿入可能であること。

(C++11以降)
v. insert ( p, rv )
(C++11以降)
Iter 効果 p の前に rv のコピーを挿入する(ムーブセマンティクスを使用する可能性あり)
戻り値 v に挿入された rv のコピーを指すイテレータ。
事前条件 T MoveInsertable であり、 C に挿入可能であること。
v. insert ( p, n, t ) Iter 効果 p の前に t n 個のコピーを挿入する。
戻り値 v に挿入された最初の要素のコピーを指すイテレータ、または n 0 の場合は p
事前条件

T CopyInsertable であり、 C にコピー挿入可能かつ CopyAssignable であること。

(C++11以降)
v. insert ( p, i, j ) Iter 効果 [ i , j ) の範囲内の要素のコピーを p の前に挿入する。
  • [ i , j ) の範囲内の各イテレータは正確に1回だけデリファレンスされる。
戻り値 v に挿入された最初の要素のコピーを指すイテレータ、または i == j true の場合 p
事前条件
(C++11以降)
  • i および j v 内に存在しないこと。
v. insert_range ( p, rg )
(C++23以降)
Iter 効果 p の前に rg の要素のコピーを挿入する。
  • 範囲 rg 内の各イテレータは正確に1回デリファレンスされる。
戻り値 v に挿入された最初の要素のコピーを指すイテレータ、または rg が空の場合は p
事前条件
v. insert ( p, il )
(C++11以降)
Iter v. insert ( p, il. begin ( ) , il. end ( ) ) と等価。
v. erase ( q ) Iter 効果 q が指す要素を削除する。
戻り値 削除される要素の直前に位置する要素を指すイテレータ、またはそのような要素が存在しない場合は q の直後の要素を指すイテレータ、あるいは v. end ( ) が返されます。
v. erase ( q1, q2 ) Iter 効果 [ q1 , q2 ) の範囲の要素を削除する。
戻り値 任意の要素が消去される前に q2 が指していた要素を指すイテレータ、またはそのような要素が存在しない場合は v. end ( ) を返す。
v. clear ( ) void 効果 v 内の全ての要素を破棄する。
  • v の要素を参照する全ての参照、ポインタ、イテレータを無効化し、past-the-endイテレータも無効化する可能性がある。
事後条件 v. empty ( ) true です。
計算量 線形。
v. assign ( i, j ) void 効果 v の要素を [ i , j ) のコピーで置き換える。
  • v の要素を参照する全ての参照、ポインタ、イテレータは無効化される。
  • [ i , j ) 内の各イテレータは正確に1回デリファレンスされる。
事前条件
  • T EmplaceConstructible であり、 C に対して * i から構築可能である。
  • T * i から代入可能である。
(C++11以降)
  • i および j v 内に存在しない。
v. assign_range ( rg )
(C++23以降)
void 効果 v の要素を rg の各要素のコピーで置き換える。
  • std:: assignable_from
    < T & , ranges:: range_reference_t < R >>
    がモデル化されていない場合、プログラムは不適格となる。
  • v の要素を参照する全ての参照、ポインタ、イテレータを無効化する。
  • 範囲 rg 内の各イテレータは正確に1回デリファレンスされる。
事前条件
v. assign ( il )
(C++11以降)
void v. assign ( il. begin ( ) , il. end ( ) ) と等価。
v. assign ( n, t ) void 効果 v の要素を n 個の t のコピーで置き換える。
事前条件

T CopyInsertable であり、 C に挿入可能かつ CopyAssignable であること。

(C++11以降)
追加操作 [3]
(指定されたシーケンスコンテナのみで必須、 std:: を省略)
意味論
v. front ( ) Ref コンテナ basic_string , array , vector , inplace_vector , deque , list , forward_list
戻り値 * v. begin ( )
cv. front ( ) CRef コンテナ basic_string , array , vector , inplace_vector , deque , list , forward_list
戻り値 * cv. begin ( )
v. back ( ) Ref コンテナ basic_string , array , vector , inplace_vector , deque , list
次と同等 auto tmp = v. end ( ) ; -- tmp ; return * tmp ; [4] .
cv. back ( ) CRef コンテナ basic_string , array , vector , inplace_vector , deque , list
次と同等 auto tmp = cv. end ( ) ; -- tmp ; return * tmp ; [5] .
v. emplace_front ( args )
(C++11以降)
void コンテナ deque , list , forward_list
効果 T のオブジェクトを、 std:: forward < Args > ( args ) ... で構築して先頭に追加する。
戻り値 v. front ( )
事前条件 T EmplaceConstructible であり、 C args から構築可能であること。
v. emplace_back ( args )
(C++11以降)
void コンテナ vector , inplace_vector , deque , list
効果 T のオブジェクトを、 std:: forward < Args > ( args ) ... で構築して追加する。
戻り値 v. back ( )
事前条件 T EmplaceConstructible であり、 C args から構築可能であること。
v. push_front ( t ) void コンテナ deque , list , forward_list
効果 t のコピーを先頭に追加する。
事前条件

T CopyInsertable であり、 C に挿入可能であること。

(C++11以降)
v. push_front ( rv )
(C++11以降)
void コンテナ deque , list , forward_list
効果 rv のコピーを先頭に追加します(move semanticsを使用する可能性があります)。
事前条件 T MoveInsertable であり、 C に挿入可能であること。
v. prepend_range ( rg )
(C++23以降)
void コンテナ deque , list , forward_list
効果 v. begin ( ) の前に rg 内の要素のコピーを [6] 挿入する。
  • rg 範囲内の各イテレータは正確に1回デリファレンスされる。
事前条件 T EmplaceConstructible であり、 C * ranges:: begin ( rg ) から構築可能であること。
v. push_back ( t ) void コンテナ basic_string , vector , inplace_vector , deque , list
効果 t のコピーを追加する。
事前条件

T CopyInsertable であり、 C に挿入可能であること。

(C++11以降)
v. push_back ( rv )
(C++11以降)
void コンテナ basic_string , vector , inplace_vector , deque , list
効果 rv のコピーを、可能であればムーブセマンティクスを使用して追加します。
事前条件 T MoveInsertable であり、 C に挿入可能であること。
v. append_range ( rg )
(C++23以降)
void コンテナ vector , inplace_vector , deque , list
効果 v. end ( ) の前に rg 内の要素のコピーを [6] 挿入する。
  • rg 範囲内の各イテレータは正確に1回デリファレンスされる。
事前条件 T EmplaceConstructible であり、 C * ranges:: begin ( rg ) から構築可能であること。
v. pop_front ( ) void コンテナ deque , list , forward_list
効果 最初の要素を破棄します。
事前条件 a. empty ( ) false であること。
v. pop_back ( ) void コンテナ basic_string , vector , inplace_vector , deque , list
効果 最後の要素を破棄する。
事前条件 a. empty ( ) false であること。
v [ n ] Ref コンテナ basic_string , array , vector , inplace_vector , deque
次と同等 return * ( v. begin ( ) + n ) ; .
cv [ n ] CRef コンテナ basic_string , array , vector , inplace_vector , deque
次と同等 return * ( cv. begin ( ) + n ) ; .
v. at ( n ) Ref コンテナ basic_string , array , vector , inplace_vector , deque
戻り値 * ( v. begin ( ) + n )
例外 次の場合に std::out_of_range をスローする: n >= v. size ( ) true の場合。
cv. at ( n ) CRef コンテナ basic_string , array , vector , inplace_vector , deque
戻り値 * ( cv. begin ( ) + n )
例外 次の場合に std::out_of_range をスローする: n >= cv. size ( ) true の場合。
注記
  1. ある式の効果が他の操作と等価である場合、それらの操作内の式の条件は、表に記載されている条件に加えて継承される。
  2. std::array 波括弧で囲まれた初期化子リスト からの代入をサポートするが、 std::initializer_list からの代入はサポートしない。
  3. 以下のすべての操作は prepend_range および append_range を除く (C++23以降) 償却定数時間を要する。
  4. C++98では、 tmp C::iterator 型として宣言されていた。
  5. C++98では、 tmp C::const_iterator 型として宣言されていた。
  6. 6.0 6.1 挿入順序は、 rg 内の要素の順序に対して非反転である。

さらに、すべてのシーケンスコンテナに対して:

  • 2つの入力イテレータを受け取るコンストラクタテンプレートと、 insert append assign replace のメンバー関数テンプレートオーバーロード(これらも2つの入力イテレータを受け取る)は、対応するテンプレート引数が LegacyInputIterator を満たさない場合、オーバーロード解決に参加しません。
  • LegacyInputIterator または Allocator テンプレートパラメータを持つ推論ガイドは、それぞれ入力イテレータまたはアロケータとして適格でない型がそのパラメータに対して推論される場合、オーバーロード解決に参加しません。
(C++17以降)

標準ライブラリ

以下の標準ライブラリ文字列型とコンテナは SequenceContainer 要件を満たします:

文字シーケンスを格納および操作する
(クラステンプレート)
(C++11)
固定サイズのインプレース連続配列
(クラステンプレート)
サイズ変更可能な連続配列
(クラステンプレート)
サイズ変更可能、固定容量、インプレース連続配列
(クラステンプレート)
両端キュー
(クラステンプレート)
単方向リンクリスト
(クラステンプレート)
双方向リンクリスト
(クラステンプレート)

使用上の注意

コンテナ 利点 欠点
std::vector 高速アクセス、連続ストレージ 挿入/削除はほぼ非効率
std:: inplace_vector 高速アクセス、インプレース連続ストレージ 固定容量、挿入/削除はほぼ非効率
std::array 高速アクセス、インプレース連続ストレージ 要素数固定、挿入/削除不可
std::deque 高速アクセス、先頭/末尾での効率的な挿入/削除 シーケンス中間での挿入/削除は非効率
std::list
std::forward_list
シーケンス中間での効率的な挿入/削除 アクセスはほぼ線形時間

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 139 C++98 オプション操作は指定されたコンテナに対して
実装が必須ではなかった
償却時間で必須化
LWG 149 C++98 v. insert ( p, t ) Iter を返すが、
v. insert ( p, n, t ) v. insert ( p, n, t )
void を返していた
全て Iter を返す
LWG 151 C++98 q1 は間接参照可能であることが要求されていた [1] 間接参照可能でなくてもよい
LWG 355 C++98 v. back ( ) または v. pop_back ( ) の呼び出しが
-- v. end ( ) を実行するため危険 [2]
v. end ( ) のコピーを
デクリメントする
LWG 589 C++98 i j が参照する要素が
C::value_type に変換可能でない可能性がある
暗黙的に
C::value_type に変換可能である
LWG 2194 C++11 std::queue std::priority_queue および
std::stack SequenceContainer とされていた [3]
これらは SequenceContainer ではない
LWG 2231 C++11 v. clear ( ) の計算量要件が
C++11で誤って省略されていた
線形計算量として再確認
LWG 3927 C++98 operator [ ] に暗黙の要件がなかった 暗黙の要件を追加
  1. これは欠陥である。なぜなら、 v. erase ( v. begin ( ) , v. end ( ) ) の動作が未定義になるためである。ただし、 v が空のコンテナの場合に限る。
  2. v. end ( ) の型が基本型である場合、 -- v. end ( ) は不適格となる。 v の型がテンプレート化されている場合、このバグは発見が困難になるため危険である。
  3. これらはC++98では SequenceContainer として文書化されていなかった。