list容器介紹

2021-07-11 10:46:01 字數 3830 閱讀 7056

相對於vector容器的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質:插入操作和刪除操作都不會造成原有的list迭代器失效,每次插入或刪除乙個元素就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list永遠是常數時間。

常用函式

listc:建立乙個空的list

listc1(c2):複製另乙個同型別元素的list

listc(n):建立n個元素的list,每個元素值由預設建構函式確定

listc(n,elem):建立n個元素的list,每個元素的值為elem

listc(begin,end):由迭代器建立list,迭代區間為[begin,end)

int size() const:返回容器元素個數

bool empty() const:判斷容器是否為空,若為空則返回true

void push_back(const t& x):list元素尾部增加乙個元素x

void push_front(const t& x):list元素首元素錢新增乙個元素x

void pop_back():刪除容器尾元素,當且僅當容器不為空

void pop_front():刪除容器首元素,當且僅當容器不為空

void remove(const t& x):刪除容器中所有元素值等於x的元素

void clear():刪除容器中的所有元素

iterator insert(iterator it, const t& x ):在迭代器指標it前插入元素x,返回x迭代器指標

void insert(iterator it,size_type n,const t& x):迭代器指標it前插入n個相同元素x

void insert(iterator it,const_iterator first,const_iteratorlast):把[first,last)間的元素插入迭代器指標it前

iterator erase(iterator it):刪除迭代器指標it對應的元素

iterator erase(iterator first,iterator last):刪除迭代器指標[first,last)間的元素

iterator begin():返回首元素的迭代器指標

iterator end():返回尾元素之後位置的迭代器指標

reverse_iterator rbegin():返回尾元素的逆向迭代器指標,用於逆向遍歷容器

reverse_iterator rend():返回首元素前乙個位置的迭代器指標

reference front():返回首元素的引用

reference back():返回尾元素的引用

void sort():容器內所有元素排序,預設是公升序

templatevoid sort(pred pr):容器內所有元素根據預斷定函式pr排序

void swap(list& str):兩list容器交換功能

void unique():容器內相鄰元素若有重複的,則僅保留乙個

void splice(iterator it,list& li):佇列合併函式,佇列li所有函式插入迭代指標it前,x變成空佇列

void splice(iterator it,list& li,iterator first):佇列li中移走[first,end)間元素插入迭代指標it前

void splice(iterator it,list& li,iterator first,iterator last):x中移走[first,last)間元素插入迭代器指標it前

void reverse():反轉容器中元素順序

#include "stdafx.h"

#include

#include

#include

using namespace std;

typedef listliststr;

int _tmain(int argc, _tchar* argv)

程式執行結果如下:

從上述**可以看出list首尾元素的增加和刪除都是非常容易的,test.front()相當於string& s=test.front(),返回了首元素的引用;test.begin()相當於list::iterator it=test.begin(),返回了首元素的迭代器指標,因此test.front()於*test.begin()的結果是一致的。

[cpp]view plain

copy

#include "stdafx.h"

#include

#include

#include

using

namespace

std;  

typedef

list<

int> listint;  

int_tmain(

intargc, _tchar* argv)  

listint::iterator it = test.begin();  

for(;it!=test.end();it++)  

cout<

//reverse show

listint::reverse_iterator rit = test.rbegin();  

for(;rit!=test.rend();rit++)  

cout

0;  

}  

程式執行結果如下:

正向迭代器與逆向迭代器表示形式是不一樣的,前者是iterator,後者是reverse_iterator。逆向顯示並不會改變元素在容器中的位置,只是逆向顯示。

[cpp]view plain

copy

#include "stdafx.h"

#include

#include

#include

using

namespace

std;  

typedef

list<

int> listint;  

int_tmain(

intargc, _tchar* argv)  

cout

<

return

0;  

}  

上面的**展示了sort merge和splice的使用,程式執行結果如下:

從允許結果可以看出,兩個鍊錶merge合併前,一般都已經俺公升序排好序,合併後的鍊錶仍然是公升序排列。merge操作是資料移動操作,不是複製操作,因此t1.merge(t2)表示把test2中所有元素依次移動並插入到源鍊錶test的適當位置,test增加了多少個元素,test2就減少了多少個元素。若用test.splice(test.begin(),test2)代替程式中的test.merge(test2),其餘不變,就能看出splice的特點。splice()完成的是拼接功能,也是資料移動操作,不慎複製操作。test.splice(test.begin(),test2)表明把test2中所有元素整體地移動到原始鍊錶test的首元素前,test增加了多少個元素,test2就減少了多少個元素。如上述**所述,test,test2排序後,test=,test2=. test.splice(test.begin(),test2)後,test=,test2={};test.merge(test2)後,test=,test2={}

list容器和forward list容器

list就是乙個雙向鍊錶,只支援雙向順序訪問,並且還是乙個環形鍊錶。因此list只需要乙個指標就可以完整表現整個鍊錶。如果讓指標node指向刻意置於尾端的乙個空白節點,node便能符合stl對於前閉後開的要求,成為last迭代器。相較於vector的連續線性空間,list就顯得複雜許多,他的好處是每...

容器篇 list容器(上)

基於vs2017編譯通過 include include include using namespace std void printlist list int list 構造初始化 void test01 list int list5 arr,arr sizeof arr sizeof int 陣...

list容器總結

1.關於list容器 list是一種序列式容器。list容器完成的功能實際上和資料結構中的雙向鍊錶是極其相似的,list中的資料元素是通過鍊錶指標串連成邏輯意義上的線性表,也就是list也具有鍊錶的主要優點,即 在鍊錶的任一位置進行元素的插入 刪除操作都是快速的。list的實現大概是這樣的 list...