C++ named requirements: SequenceContainer
SequenceContainer は、同じ型のオブジェクトを線形配置で格納する Container です。
目次 |
要件
以下の型と値が与えられた場合:
| 型 | 定義 |
C
|
シーケンスコンテナクラス |
T
|
C
の要素型
|
A
|
C
のアロケータ型:
|
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 の要件を満たす。 - 以下の文および式は適切に形成され、指定された意味を持つ:
|
基本操作
(標準ライブラリのすべてのシーケンスコンテナで必須 標準ライブラリ を除く std::array (C++11以降) ) |
|||
|---|---|---|---|
| ステートメント | セマンティクス [1] | ||
| C c ( n, t ) ; | 効果 | シーケンスコンテナを構築し、 n 個の t のコピーを保持する。 | |
| 事前条件 |
|
||
| 事後条件 | std:: distance ( c. begin ( ) , c. end ( ) ) は n である。 | ||
| C c ( i, j ) ; | 効果 |
範囲
[
i
,
j
)
と要素ごとに等しいシーケンスコンテナを構築する。
|
|
| 事前条件 |
|
||
| 事後条件 | std:: distance ( c. begin ( ) , c. end ( ) ) は std:: distance ( i, j ) である。 | ||
| 式 | 型 | 意味論 | |
|
C
(
std::
from_range
, rg
)
(C++23以降) |
C
|
効果 |
範囲
rg
と等しいシーケンスコンテナを要素ごとに構築する。
|
| 事前条件 |
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 のコピーを指すイテレータ。 | ||
| 事前条件 |
|
||
|
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 。 | ||
| 事前条件 |
|
||
| v. insert ( p, i, j ) |
Iter
|
効果 |
[
i
,
j
)
の範囲内の要素のコピーを
p
の前に挿入する。
|
| 戻り値 | v に挿入された最初の要素のコピーを指すイテレータ、または i == j が true の場合 p 。 | ||
| 事前条件 |
|
||
|
v.
insert_range
(
p, rg
)
(C++23以降) |
Iter
|
効果 |
p
の前に
rg
の要素のコピーを挿入する。
|
| 戻り値 | 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. empty ( ) は true です。 | ||
| 計算量 | 線形。 | ||
| v. assign ( i, j ) | void | 効果 |
v
の要素を
[
i
,
j
)
のコピーで置き換える。
|
| 事前条件 |
|
||
|
v.
assign_range
(
rg
)
(C++23以降) |
void | 効果 |
v
の要素を
rg
の各要素のコピーで置き換える。
|
| 事前条件 |
|
||
|
v.
assign
(
il
)
(C++11以降) |
void | v. assign ( il. begin ( ) , il. end ( ) ) と等価。 | |
| v. assign ( n, t ) | void | 効果 | v の要素を n 個の t のコピーで置き換える。 |
| 事前条件 |
|
||
|
追加操作
[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 のコピーを先頭に追加する。 | ||
| 事前条件 |
|
||
|
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]
挿入する。
|
||
| 事前条件 |
T
は
EmplaceConstructible
であり、
C
に
*
ranges::
begin
(
rg
)
から構築可能であること。
|
||
| v. push_back ( t ) | void | コンテナ |
basic_string
,
vector
,
inplace_vector
,
deque
,
list
|
| 効果 | t のコピーを追加する。 | ||
| 事前条件 |
|
||
|
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]
挿入する。
|
||
| 事前条件 |
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 の場合。 | ||
| 注記 | |||
|
|||
さらに、すべてのシーケンスコンテナに対して:
-
2つの入力イテレータを受け取るコンストラクタテンプレートと、
insert、append、assign、replaceのメンバー関数テンプレートオーバーロード(これらも2つの入力イテレータを受け取る)は、対応するテンプレート引数が LegacyInputIterator を満たさない場合、オーバーロード解決に参加しません。
|
(C++17以降) |
標準ライブラリ
以下の標準ライブラリ文字列型とコンテナは SequenceContainer 要件を満たします:
|
文字シーケンスを格納および操作する
(クラステンプレート) |
|
|
(C++11)
|
固定サイズのインプレース連続配列
(クラステンプレート) |
|
サイズ変更可能な連続配列
(クラステンプレート) |
|
|
(C++26)
|
サイズ変更可能、固定容量、インプレース連続配列
(クラステンプレート) |
|
両端キュー
(クラステンプレート) |
|
|
(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 [ ] に暗黙の要件がなかった | 暗黙の要件を追加 |