STL_listコンテナ

1.リストの紹介

リンクリストは、物理ストレージユニット上の非連続、非順次ストレージ構造であり、データ要素の論理順序は、リンクリスト内のポインターのリンク順序によって実現されます。

リンクリストは一連のノードで構成され(リンクリストの各要素はノードと呼ばれます)、実行時に動的に生成できます。各ノードには2つの部分があります。1つはデータ要素を格納するためのデータフィールドであり、もう1つは次のノードのアドレスを格納するためのポインタフィールドです。

ベクトルの連続線形空間と比較すると、リストの利点は、要素が挿入または削除されるたびに、要素の空間を構成または解放できることです。したがって、リストはスペースの使用において絶対的に正確であり、まったく無駄では​​ありません。さらに、任意の位置での要素の挿入または削除の場合、リストは常に一定の時間です。

リストとベクトルは、最も一般的に使用される2つのコンテナーです。

リストコンテナは二重にリンクされたリストコンテナであり、要素を効率的に挿入および削除できます。

リストは要素にランダムにアクセスできないため、at。(pos)関数と[]演算子はサポートされていません。

#include <リスト>

次に、リストオブジェクトのデフォルトの構造

リストは、テンプレートクラスと、オブジェクトのデフォルト構造を使用して実装されます。list<T> LIST;次のようになります:

list<int> lstInt;      //定义一个存放int的list容器。
list<float> lstFloat;   //定义一个存放float的list容器。
list<string> lstString;   //定义一个存放string的list容器。              
//尖括号内还可以设置指针类型或自定义类型。

3つ目は、頭と尻尾の操作を追加および削除することです。

list.push_back(elem); //コンテナの最後に要素を追加します

list.pop_back(); //コンテナの最後の要素を削除します

list.push_front(elem); //コンテナの先頭に要素を挿入します

list.pop_front(); //コンテナの先頭から最初の要素を削除します

	list<int> lstInt;
	lstInt.push_back(1);
	lstInt.push_back(3);
	lstInt.push_back(5);
	lstInt.push_back(7);
	lstInt.push_back(9);
	lstInt.pop_front();
	lstInt.pop_front();
	lstInt.push_front(11);
	lstInt.push_front(13);
	lstInt.pop_back();
	lstInt.pop_back();
// lstInt    {13,11,5}

4、リストデータアクセス

list.front(); //最初の要素を返します。

list.back(); //最後の要素を返します。

	list<int> lstInt;
	lstInt.push_back(1);
	lstInt.push_back(5);
	lstInt.push_back(9);

	int iFront = lstInt.front();	//1
	int iBack = lstInt.back();		//9

5、リストとイテレータ

list.begin(); //コンテナの最初の要素のイテレータを返します。

list.end(); //コンテナの最後の要素の後のイテレータを返します。

list.rbegin(); //コンテナの最後の要素のイテレータを返します。

list.rend(); //コンテナ内の最後から最後までの要素の背後にあるイテレータを返します。

for (list<int>::iterator it=lstInt.begin(); it!=lstInt.end(); ++it)	{
    
    
		cout << *it<<cout << " ";
	}

6、リストオブジェクトのパラメータ構造

list(beg、end); //コンストラクターは[beg、end)範囲の要素をそれ自体にコピーします。間隔は左に閉じて右に開いていることに注意してください。

list(n、elem); //コンストラクターはn要素をそれ自体にコピーします。

list(const list&lst); //コンストラクターをコピーします。

	list<int> mlist1;
	list<int> mlist2(10, 10); //有参构造
	list<int> mlist3(mlist2);//拷贝构造
	list<int> mlist4(mlist2.begin(), mlist2.end());

	for (list<int>::iterator it = mlist4.begin(); it != mlist4.end(); it++) {
    
    
		cout << *it << " ";
	}
	cout << endl;
/*
结果:
10 10 10 10 10 10 10 10 10 10
*/

7、リストの割り当て

list.assign(beg、end); //間隔[beg、end)のデータのコピーをそれ自体に割り当てます。間隔は左に閉じて右に開いていることに注意してください。

list.assign(n、elem); // elemのn個のコピーをそれ自体に割り当てます。

list&operator =(const list&lst); //等号演算子をオーバーロードします

list.swap(lst); // lstを独自の要素と交換します。

	list<int> lstIntA,lstIntB,lstIntC,lstIntD;
	lstIntA.push_back(1);
	lstIntA.push_back(5);
	lstIntA.push_back(9);

	lstIntB.assign(lstIntA.begin(),lstIntA.end());		//1 5 9
	lstIntC.assign(5,8);							//8 8 8 8 8
	lstIntD = lstIntA;							//1 5 9
	lstIntC.swap(lstIntD);						//互换

8、リストのサイズ

list.size(); //コンテナ内の要素の数を返します

list.empty(); //コンテナが空かどうかを判断します

list.resize(num); //コンテナの長さをnumとして再指定します。コンテナが長くなる場合は、新しい位置にデフォルト値を入力します。コンテナが短くなると、コンテナの長さを超える最後の要素が削除されます。

list.resize(num、elem); //コンテナの長さをnumとして再指定します。コンテナが長くなる場合は、新しい位置にelem値を入力します。コンテナが短くなると、コンテナの長さを超える最後の要素が削除されます。

	list<int> lstIntA;
	lstIntA.push_back(11);
	lstIntA.push_back(33);
	lstIntA.push_back(55);

	if (!lstIntA.empty())
	{
    
    
		int iSize = lstIntA.size();		//3
		lstIntA.resize(5);			//11 33 55 0 0
		lstIntA.resize(7,1);			//11 33 55 0 0 1 1
		lstIntA.resize(2);			//11 33
	}

ナイン、リスト挿入

list.insert(pos、elem); //要素要素のコピーをpos位置に挿入し、新しいデータの位置を返します。

list.insert(pos、n、elem); //位置posにnelemデータを挿入し、戻り値はありません。

list.insert(pos、beg、end); // [beg、end)間隔のpos位置にデータを挿入します。戻り値はありません。

	list<int> lstA;
	list<int> lstB;

	lstA.push_back(1);
	lstA.push_back(5);
	lstA.push_back(9);

	lstB.push_back(2);
	lstB.push_back(6);

	lstA.insert(lstA.begin(), 11);		//{11, 1, 5, 9}
	lstA.insert(++lstA.begin(),2,33);		//{11,33,33,1,5,9}
	lstA.insert(lstA.begin() , lstB.begin() , lstB.end() );	//{2,6,11,33,33,1,5,9}

10、リストを削除します

list.clear(); //コンテナのすべてのデータを削除します

list.erase(beg、end); // ** [beg、end)**間隔のデータを削除し、次のデータの位置を返します。

list.erase(pos); // pos位置のデータを削除し、次のデータの位置を返します。

lst.remove(elem); //コンテナ内のelem値に一致するすべての要素を削除します。

//删除区间内的元素
//lstInt是用list<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。
list<int>::iterator itBegin=lstInt.begin();
++ itBegin;
list<int>::iterator itEnd=lstInt.begin();
++ itEnd;
++ itEnd;
++ itEnd;
lstInt.erase(itBegin,itEnd);
//此时容器lstInt包含按顺序的1,6,9三个元素。

//假设 lstInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素的方法一
for(list<int>::iterator it=lstInt.being(); it!=lstInt.end(); )    //小括号里不需写  ++it
{
    
    
   if(*it == 3){
    
    
        it  =  lstInt.erase(it);       //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。
         //此时,不执行  ++it;  
   }
   else{
    
    
       ++it;
   }
}

//删除容器中等于3的元素的方法二
lstInt.remove(3);

//删除lstInt的所有元素
lstInt.clear();			//容器为空

11、リストの逆順

lst.reverse(); //逆リンクリスト

	list<int> lstA;
	
	lstA.push_back(1);
	lstA.push_back(3);
	lstA.push_back(5);
	lstA.push_back(7);
	lstA.push_back(9);

	lstA.reverse();			//9 7 5 3 1

おすすめ

転載: blog.csdn.net/weixin_45341339/article/details/113127304