C++STL容器list


list簡介

list又稱鏈表,使用一個double linked list(雙向串列)來管理元素,它具有不完全的雙向鏈表的功能。

使用條件:

包含頭文件

#include<list>

list類型定義於namespace std中,是個class template:

namespace std { template <typename T, typename Allocator = allocator<T> >
    class list; }

list的元素可以是任意類型T,第二個template實參可有可無,用來指定內存模型。默認的內存模型是C++標准庫提供的allocator。

list的能力

list對象自身提供了兩個pointer,或者稱為anchor(錨點),用來指向第一個和最末一個元素。而每個元素都有pointer指向前一個和后一個元素。所以一般的操作,都是操縱對應的pointer。

1.list不支持隨機訪問,list只有再訪問第一個或最末一個元素時速度很快,其他情況下如果你要訪問第五個元素,你得先順着串鏈逐一爬過前4個元素,這是一種很緩慢的行為。

2.任何位置上執行元素的安插和移除都是在常量的時間內完成,因為實際上只是進行了一些pointer操作而已。

3.安插和刪除動作並不會造成指向其他元素的各個pointer,reference和iterator失效。

4.list對於異常操作的反應始終保持 要么操作成功,要么不發生,list的每個元素有他自己的內存。

list的操作

1.創建,復制和銷毀

list<elem> c          //default構造函數,產生一個空的list
list<elem> c(c2)      //copy構造函數,建立c2的同型list並成為c2的一份拷貝
list<elem> c(n)       //利用元素的default構造函數生成一個大小為n的list
list<elem> c(n,t)     //建立一個大小為n的list,每個元素值都是t
list<elem> c(beg,end) //建立一個list,以區間[beg,end)為元素初值
c.~list()             //銷毀所有元素,釋放內存

2.非更易型操作

c.empty()    //返回是否容器為空
c.size()     //返回目前元素個數
c.max_size() //返回元素個數之最大可能量

3.賦值操作

c.assign(n,elem)     //復制n個elem,賦值給c
c.assign(beg,end)    //將區間[beg,end)所有元素賦值給c

4.元素直接訪問

c.front()  //返回第一個元素
c.back()   //返回最末元素

5.迭代器相關函數

因為不能隨機訪問元素,所以list提供的迭代器是雙向迭代器而非隨機訪問迭代器。

c.begin();  //返回一個bidirectional iterator指向第一元素
c.end();    //返回一個bidirectional iterator指向最末元素的下一位置
c.rbegin(); //返回一個reverse iterator指向反向迭代的第一元素
c.rend();   //返回一個reverse iterator指向反向迭代的最末元素的下一位置

6.元素的安插與移除

list的成員函數只進行內部pointer操作

c.push_back(elem)      //附加一個elem的拷貝於末尾
c.pop_back()           //移除最后一個元素,但是不返回它
c.push_front(elem)     //在頭部插入elem的一個拷貝
c.pop_front()          //移除第一個元素,但是不返回它
c.insert(pos,elem)     //在iterator位置pos之前方插入一個elem拷貝,並返回新元素的位置
c.insert(pos,n,elem)   //在iterator位置pos之前方插入n個elem拷貝,並返回第一個新元素的位置,如果無新元素就返回pos
c.insert(pos,beg,end)  //在iterator位置pos之前方插入區間[beg,end)內所有元素,並返回第一個新元素的位置,如果無新元素就返回pos
c.erase(pos)           //移除iterator位置pos上的元素,返回下一元素的位置
c.erase(beg,end)       //移除區間[beg,end)內的所有元素,返回下一元素的位置
c.remove(val)          //移除所有值為val的元素
c.remove_if(op)        //移除所有”造成op(elem)結果為ture“的元素
c.resize(num)          //將元素數量改為num,如果size()變大,多出的新元素都要以default函數初始化
c.resize(num,elem)     //將元素數量改為num,如果size()變大,多出新元素都是elem的拷貝
c.clear()              //移除所有元素,清空容器

關於remove_if的使用,我們給出一個移除掉所有偶數的實例

c.remove_if([](int i){ return i%2==0; });

7.list的特殊更易型操作

c.unique()                     //如果存在若干相鄰而數值相同的元素,就移除重復元素,只留一個
c.unique(op)                   //如果存在若干相鄰元素都使op為true,就移除重復元素,只留一個
c.splice(pos,c2)               //將c2內的元素轉移到c之內,迭代器pos之前
c.splice(pos,c2,c2pos)         //將c2內的c2pos所指元素轉移到c內的pos所指位置
c.splice(pos,c2,c2beg,c2end)   //將c2內的[c2beg,c2end)區間內所有元素轉移到c內的pos之前
c.sort()                       //以operator<為准則為所有元素排序
c.sort(op)                     //以op()為准則為所有元素排序
c.merge(c2)                    //假設c和c2容器都包含op()准則下的已排序元素,將c2的全部元素轉移到c,並保證合並后的list仍為已排序
c.merge(c2,op)                 //假設c和c2容器都包含已排序元素,將c2的全部元素轉移到c,並保證合並后的list在op()准則下仍為已排序
c.reverse()                    //將所有元素反序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM