1. 程式人生 > >C++容器之List容器初學

C++容器之List容器初學

List簡介

² list是一個雙向連結串列容器,可高效地進行插入刪除元素。

² list不可以隨機存取元素,所以不支援at.(pos)函式與[]操作符。It++(ok) it+5(err)

² #include <list>  

list物件的預設構造

list採用採用模板類實現,物件的預設構造形式:list<T> lstT;  如:

list<int> lstInt;            //定義一個存放intlist容器。

list<float> lstFloat;     //定義一個存放floatlist容器。

list<string> lstString;     //定義一個存放

stringlist容器。

...     

//尖括號內還可以設定指標型別或自定義型別。

list頭尾的新增移除操作

² 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}

list的資料存取

² list.front();   //返回第一個元素。

² list.back();  //返回最後一個元素。

list<int> lstInt;

lstInt.push_back(1);

lstInt.push_back(3);

lstInt.push_back(5);

lstInt.push_back(7);

lstInt.push_back(9);

int iFront = lstInt.front(); //1

int iBack = lstInt.back(); //9

lstInt.front() = 11; //11

lstInt.back() = 19; //19

list與迭代器

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

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

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

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

list<int> lstInt;

lstInt.push_back(1);

lstInt.push_back(3);

lstInt.push_back(5);

lstInt.push_back(7);

lstInt.push_back(9);

for (list<int>::iterator it=lstInt.begin(); it!=lstInt.end(); ++it)

{

cout << *it;

cout << " ";

}

for (list<int>::reverse_iterator rit=lstInt.rbegin(); rit!=lstInt.rend(); ++rit)

{

cout << *rit;

cout << " ";

}

list物件的帶引數構造

² list(beg,end);    //建構函式將[beg, end)區間中的元素拷貝給本身。注意該區間是左閉右開的區間。

² list(n,elem);   //建構函式將n個elem拷貝給本身。

² list(const list &lst);  //拷貝建構函式。

list<int> lstIntA;

lstIntA.push_back(1);

lstIntA.push_back(3);

lstIntA.push_back(5);

lstIntA.push_back(7);

lstIntA.push_back(9);

list<int> lstIntB(lstIntA.begin(),lstIntA.end()); //1 3 5 7 9

list<int> lstIntC(5,8); //8 8 8 8 8

list<int> lstIntD(lstIntA); //1 3 5 7 9

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(3);

lstIntA.push_back(5);

lstIntA.push_back(7);

lstIntA.push_back(9);

lstIntB.assign(lstIntA.begin(),lstIntA.end()); //1 3 5 7 9

lstIntC.assign(5,8); //8 8 8 8 8

lstIntD = lstIntA; //1 3 5 7 9

lstIntC.swap(lstIntD); //互換

list的大小

² list.size();    //返回容器中元素的個數

² list.empty();    //判斷容器是否為空

² list.resize(num);   //重新指定容器的長度為num,若容器變長,則以預設值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。

² list.resize(num, elem);  //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。

list<int> lstIntA;

lstIntA.push_back(1);

lstIntA.push_back(3);

lstIntA.push_back(5);

if (!lstIntA.empty())

{

int iSize = lstIntA.size(); //3

lstIntA.resize(5); //1 3 5 0 0

lstIntA.resize(7,1); //1 3 5 0 0 1 1

lstIntA.resize(2); //1 3

}

list的插入

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

² list.insert(pos,n,elem);   //pos位置插入nelem資料,無返回值。

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

list<int> lstA;

list<int> lstB;

lstA.push_back(1);

lstA.push_back(3);

lstA.push_back(5);

lstA.push_back(7);

lstA.push_back(9);

lstB.push_back(2);

lstB.push_back(4);

lstB.push_back(6);

lstB.push_back(8);

lstA.insert(lstA.begin(), 11); //{11, 1, 3, 5, 7, 9}

lstA.insert(++lstA.begin(),2,33); //{11,33,33,1,3,5,7,9}

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

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(); //容器為空

list的反序排列

² lst.reverse();     //反轉連結串列,比如lst包含1,3,5元素,執行此方法後,lst就包含5,3,1元素。

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

小結:

² 一、容器deque的使用方法

適合 在頭尾新增移除元素。使用方法與vector類似。

² 二、容器queue,stack的使用方法

適合佇列,堆疊的操作方式。

² 三、容器list的使用方法

適合在任意位置快速插入移除元素