STL之list函式詳解

2022-09-08 10:51:12 字數 4389 閱讀 5158

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"

#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);

}

呼叫listexample函式後的執行結果:

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的第...