list使用雙向鍊錶來管理元素,可以從兩端發展新元素,其內部結構如圖1所示。
圖1 list的結構list的內部結構和vetor或deque截然不同,主要的區別入下:
list所提供的成員函式區別
:list的好處是不論在任何位置,元素的安插和移除都只需要常數時間。如果我們要將若干元素從a容器移動b容器,使用splice函式將會更加高效,splice中文解釋為銜接,鏈結,結合。從名字中就可以看出,該函式的功能,如圖2所示是將元素3從容器a轉移到容器b中,c之前(舉例用,未考慮型別),從執行動作中,可以看到執行splice函式後,原容器中就不包含該元素了,是轉移屬於操作。
圖2 splice舉例list類提供了多種操作元素的函式和演算法,這些函式可以滿足大部分的應用場景。
list的建構函式和析構函式listc
產生乙個空list,其中沒有任何元素
listc1(c2)
產生另乙個同型list的副本(所有的元素都被拷貝)
listc(n)
利用元素的default建構函式產生乙個大小為n的list
listc(n,elem)
產生乙個大小為n的list,每個元素值都是elem
listc(beg, end)
產生乙個list,以區間[beg, end)做為元素初值
c.~list()
銷毀所有元素,並釋放記憶體
list的非變動性操作c.size()
返回容器的大小
c.empty()
判斷容器是否為空,等價於size()==0,但可能更快
c.max_size()
返回容器最大的可以儲存的元素
reserve()
如果容量不足,擴大之
c1 == c2
判斷c1 是否等於c2
c1 != c2
判斷c1是否不等於c2
c1 < c2
判斷c1 是否小於c2
c1 > c2
判斷c1 是否大於c2
c1 <= c2
判斷c1是否小於等於c2
c1 >= c2
判斷c1是否大於等於c2
list的賦值操作c1 = c2
將c2的全部元素賦值給c1
c.assign(n, elem)
複製n個elem,複製給c
c.assign(beg, end)
將區間[beg;end)內的元素賦值給c
c1.swap(c2)
將c1和c2元素互換
swap(c1,c2)
同上,此為全域性函式
list元素之間訪問c.front
返回第乙個元素,不檢查元素存在與否
c.back
返回最後乙個元素,不檢查元素存在與否
list迭代器相關函式c.begin()
返回乙個雙向迭代器,指向第乙個元素
c.end()
返回乙個雙向迭代器,指向最後乙個元素的下乙個位置
c.begin()
返回乙個逆向迭代器,指向逆向迭代的第乙個元素
c.end()
返回乙個逆向迭代器,
指向逆向迭代的最後乙個元素的下乙個位置
list安插、移除操作函式c.insert(pos, elem)
在迭代器pos所指位置上安插乙個elem副本,
並返回新元素的位置
c.insert(pos,n,elem)
在pos位置上插入n個elem副本,無返回值
c.insert(pos,beg,end)
在pos位置上插入區間[beg,end)內的所有元素的副本
沒有返回值
c.push_back(elem)
在尾部新增乙個elem副本
c.pop_back()
移除最後乙個元素,無返回值
c.push_front()
在頭部新增乙個elem副本
c.pop_front()
移除第乙個元素,但不返回
c.remove(val)
移除所有其值為val的元素
c.remove_if()
c.erase(pos)
移除pos位置上的元素,返回下乙個元素的位置
c.erase(beg, end)
移除[beg, end)區間內的所有元素,
返回下乙個元素的位置
c.resize(num)
將元素數量改為num(如果size()變大了,
多出來的新元素都需以default建構函式完成)
c.resize(num,elem)
將元素數量改為num(如果size()變大了,
多出來的新元素都elem的副本)
c.clear()
移除所有元素,將容器清空
備註:安插和移除元素,都會使「作用點」之後的各個元素的iterator等失效,若發生記憶體重新分配,該容器身上的所有iterator等都會失效
list的特殊變動性操作c.unique()
如果存在若干相鄰而數值相等的元素,就移除重複元素,
之留下乙個
c.unique(op)
如果存在若干相鄰元素,都使op()的結果為ture,
則移除重複元素,只留下乙個。
c1.splice(pos, c2)
將c2內的所有元素轉移到c1之內,迭代器pos之前
c1.splice(pos, c2, c2pos)
將c2內的c2pos所指元素轉移到c1之內的pos所指位置上
(c1,c2可相同)
c1.splice(pos, c2,
c2beg,c2end)
將c2內的[c2beg,c2end)區間內所有元素轉移到
c1內的pos之前(c1,c2可相同)
c.sort()
以operator《為準則,對所有元素排序
c.sort(op)
以op()為準則,對所有元素排序
c1.merge(c2)
假設c1和c2容器都包含已序(相同的排序方式)元素,將c2的全部元素轉移到c1,並保證合併後的list還是已序。
c1.merge(c2,op)
假設c1和c2容器都包含op()原則下的已序(相同的排序方式)元素,將c2的全部元素轉移到c1,並保證合併後的list在op()原則仍是已序。
c.reverse()
將所有元素反序
#include "stdafx.h"呼叫listexample函式後的執行結果:#include #include #include #include using namespace std;
void printlists(const list&list1, const list&list2)
void listexample()
//list1: 0 1 2 3 4 5 //list2: 5 4 3 2 1 0
printlists(list1, list2);
list2.splice(find(list2.begin(), list2.end(), 3), list1);
printlists(list1, list2);
list2.splice(list2.end(), list2, list2.begin());
printlists(list1, list2);
list2.sort();
list1 = list2;
list2.unique();
printlists(list1, list2);
list1.merge(list2);
printlists(list1, list2);
list1.reverse();
printlists(list1, list2);
}
STL之四 list用法詳解
相對於vector容器的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質 插入操作和刪除操作都不會造成原有的list迭代器失效,每次插入或刪除乙個元素就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list永遠是常數時間。常用函式 listc 建立乙個空的list listc...
STL之vector函式詳解
vector的建構函式和析構函式 vectorc 產生乙個空vector,其中沒有任何元素 vectorc1 c2 產生另乙個同型vector的副本 所有的元素都被拷貝 vectorc n 利用元素的default建構函式產生乙個大小為n的vector vectorc n,elem 產生乙個大小為n...
STL 函式 詳解
find array.begin array.end int val a.遍歷整個範圍。b.如果沒有找到,則返回array.end,如果找到,則返回第乙個相等元素的迭代器。lower bound array.begin array.end int val a.二分查詢。b.返回範圍內不小於val的第...