STL_list容器

1、List簡介

鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是經過鏈表中的指針連接次序實現的。函數

鏈表由一系列結點(鏈表中每個元素稱爲結點)組成,結點能夠在運行時動態生成。每一個結點包括兩個部分:一個是存儲數據元素的數據域,另外一個是存儲下一個結點地址的指針域。指針

相較於vector的連續線性空間,list的好處是每次插入或者刪除一個元素,就是配置或者釋放一個元素的空間。所以,list對於空間的運用有絕對的精準,一點也不浪費。並且,對於任何位置的元素插入或元素的移除,list永遠是常數時間。code

List和vector是兩個最常被使用的容器。對象

list容器是一個雙向鏈表容器,可高效地進行插入刪除元素。blog

list不能夠隨機存取元素,因此不支持at.(pos)函數與[]操做符。rem

#include <list>string

2、list對象的默認構造

list採用採用模板類實現,對象的默認構造形式:list<T> LIST; 如:it

list<int> lstInt;      //定義一個存放int的list容器。
list<float> lstFloat;   //定義一個存放float的list容器。
list<string> lstString;   //定義一個存放string的list容器。              
//尖括號內還能夠設置指針類型或自定義類型。

3、list頭尾的添加移除操做

list.push_back(elem); //在容器尾部加入一個元素模板

list.pop_back(); //刪除容器中最後一個元素class

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的數據存取

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與迭代器

list.begin(); //返回容器中第一個元素的迭代器。

list.end(); //返回容器中最後一個元素以後的迭代器。

list.rbegin(); //返回容器中倒數第一個元素的迭代器。

list.rend(); //返回容器中倒數最後一個元素的後面的迭代器。

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

6、list對象的帶參數構造

list(beg,end); //構造函數將[beg, end)區間中的元素拷貝給自己。注意該區間是左閉右開的區間。

list(n,elem); //構造函數將n個elem拷貝給自己。

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的賦值

list.assign(beg,end); //將[beg, end)區間中的數據拷貝賦值給自己。注意該區間是左閉右開的區間。

list.assign(n,elem); //將n個elem拷貝賦值給自己。

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的大小

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
	}

9、list的插入

list.insert(pos,elem); //在pos位置插入一個elem元素的拷貝,返回新數據的位置。

list.insert(pos,n,elem); //在pos位置插入n個elem數據,無返回值。

list.insert(pos,beg,end); //在pos位置插入[beg,end)區間的數據,無返回值。

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的刪除

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、list的反序排列

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
相關文章
相關標籤/搜索