C++——list超詳細紹介
3228 ワード
list:
listは、定数範囲内の任意の位置で挿入および削除可能なシーケンスコンテナであり、前後に双方向に反復することができる.
Listの下位層は双方向チェーンテーブル構造であり、双方向チェーンテーブルの各要素は互いに関連しない独立したノードに格納され、ノードではポインタで前の要素と後の要素を指す.
listとforward_listは非常に似ています.最も主要な違いはforward_です.Listは単一チェーンテーブルであり、前に反復するしかなく、より簡単で効率的です.
他のシーケンスコンテナ(array,vector,deque)に比べてlistは通常、任意の場所で要素を挿入、除去する実行効率が高い.
他のシリアルコンテナと比較してlistとforward_Listの最大の欠点は、listの6番目の要素にアクセスするには、頭や尾などの既知の位置からその位置に反復する必要があるなど、任意の場所のランダムアクセスをサポートしないことです.
構築:
コンストラクション関数: list()構造空のlist list(size_type n,const value_type&val=value_type()構造のlistには、n個の値がvalの要素 が含まれる list(const list&x)コピーコンストラクタ list(InputIterator栖rst,InputIterator last)は、[栖rst,last)区間の要素でlist を構築する.
反復器: begin()は、最初の要素の反復器 を返す end()最後の要素の次の位置を返す反復器 rbegin()は、最初の要素のreverse_を返します.iterator、すなわちend位置 rend()は、最後の要素の次の位置のreverse_を返します.iterator、すなわちbegin位置 cbegin()(C++11)は、最初の要素のcosnt_を返します.iterator cend()(C++11)最後の要素の次の位置を返すconst_iterator crbegin()(C++11)すなわちcrend()位置 crend()(C++11)すなわちcrbegin()位置 capacity: bool empty()constはlistが空であるかどうかを検出し、trueを返し、そうでなければfalse を返す. size_t size()constはlistの有効ノードの個数 を返す.
関数: void push_front(const value_type&val)listヘッダエレメントの前にvalの値を持つエレメント を挿入する void pop_front()リストの最初の要素 を削除 void push_back(const value_type&val)list末尾にvalの値を挿入する要素 void pop_back()リストの最後の要素 を削除 iterator insert(iterator position,const value_type&val)list position位置にval値の要素 を挿入する void insert(iterator position,size_type n,const value_type&val)list position位置にn個の値valの要素 を挿入する void insert(iterator position,InputIterator栖rst,InputIterator last)はlist position位置に[栖rst,last]区間に要素 を挿入する. iterator erase(iterator position)リストposition位置の要素 を削除 iterator erase(iterator栖rst,iterator last)リストの[栖rst,last)区間の要素 を削除 void swap(list&x)交換2つのlistの要素 void resize(size_type n,value_type val=value_type()リスト内の有効要素の個数をn個に変更し、複数の要素を にvalで埋め込む void clear()リストの有効要素 をクリア
注意:
push_backエンドプラグイン:まず要素を構築し、次に要素をノードにコピーし、挿入時に構造関数を調整し、コピー構造関数を調整します.
emplace_backエンドプラグイン:ノードを構築し、コンストラクション関数を呼び出してノード内でオブジェクトを直接構築します.
emplace_back比push_backはより効率的で、コピー構造関数の呼び出しが1回も少なくなりました.
Listの反復器が無効になりました:
反復器が無効な場合、反復器が指すノードが無効な場合、ノードが削除されます.listの下位構造は先頭ノードの双方向ループチェーンテーブルであるため、listに挿入するとlistの反復器が失効することはなく、削除時にのみ失効し、削除されたノードを指す反復器だけが失効し、他の反復器は影響を受けない.
解決策:eraseを実装すると、削除後の要素の反復器が返されます.
注意:erase()関数:コンテナ内の要素を削除します.
listは、定数範囲内の任意の位置で挿入および削除可能なシーケンスコンテナであり、前後に双方向に反復することができる.
Listの下位層は双方向チェーンテーブル構造であり、双方向チェーンテーブルの各要素は互いに関連しない独立したノードに格納され、ノードではポインタで前の要素と後の要素を指す.
listとforward_listは非常に似ています.最も主要な違いはforward_です.Listは単一チェーンテーブルであり、前に反復するしかなく、より簡単で効率的です.
他のシーケンスコンテナ(array,vector,deque)に比べてlistは通常、任意の場所で要素を挿入、除去する実行効率が高い.
他のシリアルコンテナと比較してlistとforward_Listの最大の欠点は、listの6番目の要素にアクセスするには、頭や尾などの既知の位置からその位置に反復する必要があるなど、任意の場所のランダムアクセスをサポートしないことです.
構築:
コンストラクション関数:
反復器:
関数:
注意:
push_backエンドプラグイン:まず要素を構築し、次に要素をノードにコピーし、挿入時に構造関数を調整し、コピー構造関数を調整します.
emplace_backエンドプラグイン:ノードを構築し、コンストラクション関数を呼び出してノード内でオブジェクトを直接構築します.
emplace_back比push_backはより効率的で、コピー構造関数の呼び出しが1回も少なくなりました.
Listの反復器が無効になりました:
反復器が無効な場合、反復器が指すノードが無効な場合、ノードが削除されます.listの下位構造は先頭ノードの双方向ループチェーンテーブルであるため、listに挿入するとlistの反復器が失効することはなく、削除時にのみ失効し、削除されたノードを指す反復器だけが失効し、他の反復器は影響を受けない.
void TestListIterator1() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list l(array, array+sizeof(array)/sizeof(array[0]));
auto it = l.begin();
while (it != l.end()) {
// erase() ,it ,
// it , it ,
l.erase(it);
++it;
}
}
解決策:eraseを実装すると、削除後の要素の反復器が返されます.
void TestListIterator1() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list l(array, array+sizeof(array)/sizeof(array[0]));
auto it = l.begin();
while (it != l.end()) {
it = l.erase(it);
//
//list ::iterator to_delete=it2;
//it2++;//
//L.erase(to_delete);//
}
}
注意:erase()関数:コンテナ内の要素を削除します.