一、List簡介
鏈表是一種物理存盤單元上非連續、非順序的存盤結構,資料元素的邏輯順序是通過鏈表中的指標鏈接次序實作的,
鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成,每個結點包括兩個部分:一個是存盤資料元素的資料域,另一個是存盤下一個結點地址的指標域,
相較于vector的連續線性空間,list的好處是每次插入或者洗掉一個元素,就是配置或者釋放一個元素的空間,因此,list對于空間的運用有絕對的精準,一點也不浪費,而且,對于任何位置的元素插入或元素的移除,list永遠是常數時間,
List和vector是兩個最常被使用的容器,
list容器是一個雙向鏈表容器,可高效地進行插入洗掉元素,
list不可以隨機存取元素,所以不支持at.(pos)函式與[]運算子,
#include <list>

二、list物件的默認構造
list采用采用模板類實作,物件的默認構造形式:list<T> LIST; 如:
list<int> lstInt; //定義一個存放int的list容器,
list<float> lstFloat; //定義一個存放float的list容器,
list<string> lstString; //定義一個存放string的list容器,
//尖括號內還可以設定指標型別或自定義型別,
三、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(5);
lstInt.push_back(9);
int iFront = lstInt.front(); //1
int iBack = lstInt.back(); //9
五、list與迭代器
list.begin(); //回傳容器中第一個元素的迭代器,
list.end(); //回傳容器中最后一個元素之后的迭代器,
list.rbegin(); //回傳容器中倒數第一個元素的迭代器,
list.rend(); //回傳容器中倒數最后一個元素的后面的迭代器,
for (list<int>::iterator it=lstInt.begin(); it!=lstInt.end(); ++it) {
cout << *it<<cout << " ";
}
六、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
*/
七、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); //互換
八、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
}
九、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}
十、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(); //反轉鏈表
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/252424.html
標籤:C++
上一篇:STL_queue容器
下一篇:C++概念性總結
