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的插入和刪除操作都不...