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の反復器が失効することはなく、削除時にのみ失効し、削除されたノードを指す反復器だけが失効し、他の反復器は影響を受けない.
    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()関数:コンテナ内の要素を削除します.