リンク:https://zhuanlan.zhihu.com/p/24297619
出典:
著者がほぼ著作権を所有していることを知ってい ます。商用の再版については、著者に連絡して許可を得てください。非商用の再版については、出典を示してください。
ステートメント:
- 記事の内容は「C ++ Primer Chinese Edition(5th Edition)」から収集・編集されたものであり、著作権は原本に帰属します。
- オリジナルの本はより詳細で素晴らしい解釈を持っています、学習のために本物の本を購入してください。
- この記事は学習とコミュニケーションのみを目的としており、いかなる形式の転載も禁止されています
テキスト
- コンテナはすべてテンプレートクラスです
- イテレータ
- 関数の開始と終了
- 定義と初期化
- 割り当てとスワップ
- コンテナサイズ
- 関係演算
テンプレートクラス
list<int>
deque<double>
コンテナのコンテナを定義することもできます。
vector<string>
vector<vector<string>>
イテレータ
イテレータ範囲(開始、終了)
終了は終了後の要素を指し、開始はインクリメントすることで終了に到達できます
このスコープ契約により、コンテナを簡単かつ安全にトラバースできます
while( begin != end )
{
cout << *begin << endl;
++begin;
}
追加のnull操作も必要ありません。begin== endの場合、範囲は空であり、ループは実行されません。
関数の開始と終了
- beginは開始イテレータを返します
- cbeginは定数イテレータを返します
- rbeginは逆イテレータを返します
実際には、beginという名前の2つの関数がコンテナにあります
- 1つはconstメンバーであり、コンテナーのconst_iteratorを返します。
- 1つは非constメンバーであり、コンテナーのイテレーターを返します
iterator begin();
const_iterator begin() const;
したがって、以下の型判定
auto itr = a.begin();
aがconstの場合のみ、itrはconst_iteratorです
定義と初期化
別のコンテナのコピーとしてコンテナを作成する方法は2つあります
- コンテナ全体を直接コピーします(2つのコンテナのコンテナタイプと要素タイプが一致している必要があります)
- イテレータによって指定された範囲の要素をコピーします(要素のみを変換できます)
C c1(c2);
C c1 = c2;
C c( beg, end );
リストの初期化
list<string> authors = {"a", "b", "c"};
vector<const char*> articles = {"a", "b", "c"};
シーケンスコンテナ固有のコンストラクタ
コンテナのサイズと初期値を受け入れる(オプション)
vector<int> ivec(10, -1);
list<string> svec(10, "hi");
forward_list<int> ivec (10);
配列はこのメソッドをサポートしていません
アレイ構築
組み込み配列と同様に、コンテナサイズは配列型の一部です
array<int, 42> arr;
array<int, 42>::size_type i;
array<int, 10> ia1;
array<int, 10> ia2 = {0,1,2,3,4,5,6,7,8,9};
array<int, 10> ia3 = {42};
組み込み配列とは異なり、配列はコピーと割り当てをサポートします
割り当てとスワップ
c1 = c2;
割り当て後、c1の要素の数と値はc2の要素と同じです。
割り当てが完了した後、2つのコンテナ間に相関関係はありますか?
配列の場合、長さは型の一部であり、型は割り当て前に一貫している必要があります
array<int, 10> a1 = {0,1,2,3,4,5,6,7,8,9};
array<int, 10> a2 = {0};
a1 = a2;
そして
array<int, 10> a2 = {0};
a2 = {0};
違法です。配列はリストの割り当てを受け入れません
また、初期化と割り当てが2つの異なるものであることも示しています
- 初期化はコンストラクターを呼び出します
- 割り当てによって呼び出された演算子オーバーロード関数
割当
シーケンスコンテナは、assignという名前のメンバーも定義します
- seq.assign(beg、end)は、イテレータ範囲内の要素をコンテナに割り当てます
- seq.assign(il)は、初期化リストの要素をコンテナに割り当てます
- seq.assign(n、t)は、コンテナ内の要素を、値がtであるn個の要素に置き換えます。
配列は割り当てもサポートしていません
スワップ
2つのコンテナが同じタイプの場合、スワップで内容を交換できます
また、スワップはコンテナのデータ構造のみを変更するため、割り当てや割り当てなどの要素のコピー操作よりもはるかに高速です。
----------itr1-----------
-----------↓-------------
svec1→{A0, A1, A2,A3}
svec2→{B0, B1, B2, B3, B4}
交換後
----------itr1-----------
-----------↓-------------
svec2→{A0, A1, A2,A3}
svec1→{B0, B1, B2, B3, B4}
スワップとは、コンテナの構造が変更されただけであり、以前のイテレータなどが指す要素は変更されません。しかし、要素は別のコンテナに属しています
文字列は例外です。swapを呼び出すと、イテレータ、参照、およびポインタが無効になります。
配列はより特別であり、そのスワップは実際の要素交換です
----------itr1-----------
-----------↓-------------
arr1→{A0, A1, A2,A3}
arr2→{B0, B1, B2, B3, B4}
交換後
arr1→{B0, B1, B2, B3, B4}
arr2→{A0, A1, A2,A3}
-----------↑-------------
----------itr1-----------
コンテナサイズ操作
サイズ
空
max_size
コンテナの関係演算
同じタイプのコンテナのみを比較できます