鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是經過鏈表中的指針連接次序實現的。函數
鏈表由一系列結點(鏈表中每個元素稱爲結點)組成,結點能夠在運行時動態生成。每一個結點包括兩個部分:一個是存儲數據元素的數據域,另外一個是存儲下一個結點地址的指針域。指針
相較於vector的連續線性空間,list的好處是每次插入或者刪除一個元素,就是配置或者釋放一個元素的空間。所以,list對於空間的運用有絕對的精準,一點也不浪費。並且,對於任何位置的元素插入或元素的移除,list永遠是常數時間。code
List和vector是兩個最常被使用的容器。對象
list容器是一個雙向鏈表容器,可高效地進行插入刪除元素。blog
list不能夠隨機存取元素,因此不支持at.(pos)函數與[]操做符。rem
#include <list>string
list採用採用模板類實現,對象的默認構造形式:list<T> LIST; 如:it
list<int> lstInt; //定義一個存放int的list容器。 list<float> lstFloat; //定義一個存放float的list容器。 list<string> lstString; //定義一個存放string的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}
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.begin(); //返回容器中第一個元素的迭代器。
list.end(); //返回容器中最後一個元素以後的迭代器。
list.rbegin(); //返回容器中倒數第一個元素的迭代器。
list.rend(); //返回容器中倒數最後一個元素的後面的迭代器。
for (list<int>::iterator it=lstInt.begin(); it!=lstInt.end(); ++it) { cout << *it<<cout << " "; }
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.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.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位置插入一個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.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(); //容器爲空
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