STL通用容器之 list 容器

2021-06-22 15:33:28 字數 3627 閱讀 6683

list容器

相對於vector的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質:插入操作和刪除操作都不會造成原有的list迭

器失效,每次插入或刪除乙個元素,就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list

遠是常數時間。

(1)建構函式

listc;建立乙個空的list

listc1(c2);拷貝另乙個同型別元素的list

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

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

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

(2)大小、判斷空函式

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

bool empty() const;判斷容器是否空,若返回true,表明容器已空

(3)增加、刪除函式:

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 = t());在迭帶器指標it前插入元素x,返回x迭帶器指標

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

void insert(iterator it, const_iterator first, const_iterator last);把[first, last)間的元素插入迭  帶指標it前

iterator erase(iterator it);

刪除迭帶器指標it對應的元素

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

(4)遍歷函式

iterator begin();

返回首元素的迭帶器指標

iterator end();

返回尾元素後的迭帶器指標,而不是尾元素的迭帶器指標

reverse_iterator rbegin();

返回尾元素的逆向迭帶器指標,用於逆向遍歷容器

reverse_iterator rend();

返回首元素前的逆向迭帶器指標,用於逆向遍歷容器

reference front();

返回首元素的引用

reference back();

返回尾元素的引用

(5)操作函式

void sort();

容器內所有元素排序,預設是公升序

template void sort(pred pr); 容器內所有元素根據預判定函式pr排序

void swap(list& str);

兩list容器交換功能

void unique();

容器內相鄰元素若有重複的,則僅保留乙個

void splice(iterator it, list& x);

佇列合併函式,佇列x所有元素插入迭代指標it前,x變成空佇列

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

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

void reverse();

反轉容器中元素順序

基本操作示例

#include #include #include using namespace std;

typedef listliststr;

void main()

遍歷示例

#include#includeusing namespace std;

int main()

l.remove(4);

list::iterator it=l.begin();

while(it!=l.end())

cout<::iterator itt=l.begin();

l.erase(itt);

list::reverse_iterator rit=l.rbegin();

while(rit!=l.rend())

cout<

sort、merge、splice示例。#include

#include#includeusing namespace std;

int main()

cout<

(1)兩個鍊錶merge合併前,一般都已經按公升序排好序,合併後的鍊錶元素仍然是公升序序列。

(2)merge操作是資料移動操作,不是拷貝操作,因此l1.merge(l2)表示把l2中所有元素依次移動並插入到源鍊錶l1的適當位置,l1增加了多少個元素,l2就減少了多少個元素。

(3)若用l1.splice(l1.begin(), l2)代替程式中的l1.merge(l2),其餘不變,就能看出splice的特點。splice完成的是拼接功能,且也是資料移動操作,不是拷貝操作。l1.splice(l1.begin(), l2)表明把l2中所有元素整體的移動到原始鍊錶l1的首元素前,l1增加了多少個元素,l2就減少了多少個元素。

綜合操作示例

兩個文字檔案中包含某中學的高考成績,包含准考證號、姓名、所考大學名、總成績資訊,准考證號是關鍵字。但可能由於一些原因,造成兩個檔案中有重複的紀錄,現要求把兩個檔案內容和並在一起,去掉重複紀錄,並按准考證號公升序排列。

分析:(1)把兩個文字檔案資料對映成兩個list容器中的元素;(2)對兩個list容器分別按准考證號進行公升序排序,利用函式是sort;(3)合併兩個已排好序的list容器元素,利用函式是merge;(4)利用unique函式去掉准考證號重複的記錄,僅保留乙個即可。

#include#include#includeusing namespace std;

class student

string getnum()

string getname()

string getun()

int getscore()

bool operator <(student &s)

bool operator ==(student &s)

};ostream &operator<<(ostream &os,student &s)

bool merge(studentmanger &stu)

void show()

{for(list::iterator it=mylist.begin();it!=mylist.end();it++)

{cout<<*it<

STL通用容器之 deque 容器

1.5deque容器 deque容器為乙個給定型別的元素進行線性處理,就如向量,它能夠快速地隨機進入任乙個元素,並且能夠高效地 入和刪除容器的尾部元素。但它與vector不同,deque能支援高效插入和刪除容器的頭部元素,也叫做雙端佇列.1 建構函式 deque 建立乙個空deque deque i...

STL順序容器 list

list是乙個線性鍊錶結構,它的資料由若干個節點構成,每乙個節點都包括乙個 息塊 即實際儲存的資料 乙個前驅指標和乙個後驅指標。它無需分配指定 記憶體大小且可以任意伸縮,這是因為它儲存在非連續的記憶體空間中,並且由指 針將有序的元素鏈結起來。由於其結構的原因,list 隨機檢索的效能非常的不好,因為...

教你使用STL容器之list

相較於vector的連續線性空間,list就稍微有點複雜,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。list對於空間的運用有絕對的精準,一點也不浪費,而且對於任何位置元素的插入和刪除,list時間複雜度為o 1 list底層是乙個帶頭結點的雙向迴圈鍊錶。list的插入和刪除操作都不...