list容器介紹
相對於vector容器的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質:插入操作和刪除操作都不會造成原有的list迭代器失效,每次插入或刪除乙個元素就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list永遠是常數時間。
區別與其他佇列容器(vector,list,deque):
list就是資料結構中的雙向鍊錶(根據sgi stl源**),因此它的記憶體空間可以是不連續
的,通過指標來進行資料的訪問,這個特點使得它的隨機訪問變的非常沒有效率,因此它
沒有提供操作符的過載。但由於鍊錶的特點,它可以以很好的效率支援任意地方的刪除
和插入。
什麼情況下選用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 ):在迭代器指標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)間的元素
(4) 遍歷函式
iterator begin():返回首元素的迭代器指標
iterator end():返回尾元素之後位置的迭代器指標
reverse_iterator rbegin():返回尾元素的逆向迭代器指標,用於逆向遍歷容器
reverse_iterator rend():返回首元素前乙個位置的迭代器指標
reference front():返回首元素的引用
reference back():返回尾元素的引用
(5) 操作函式
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():反轉容器中元素順序
簡單的示例:
listlistint;
int a[5] = ;
list::iterator iterint;
listint.insert(listint.begin(), a,a+5);
for (iterint = listint.begin(); iterint != listint.end(); iterint++)
前面4類函式都比較簡單,說一說第5類操作函式的sort()函式:
1.sort()函式:預設公升序,並使用less和greater排序
#include #include using namespace std;
int _tmain(int argc, _tchar* argv)
; list::iterator iterint;
listinttwo.sort();
for (iterint = listinttwo.begin(); iterint != listinttwo.end(); iterint++)
return 0;
}
輸出:
1621
131341
451571
請按任意鍵繼續. . .
less和greater,公升序和降序
#include #include #include //greater必須包含此檔案
using namespace std;
int _tmain(int argc, _tchar* argv)
; list::iterator iterint;
greatersortfunc;//降序
//lesssortfunc;//公升序
listinttwo.sort(sortfunc);
for (iterint = listinttwo.begin(); iterint != listinttwo.end(); iterint++)
return 0;
}
2.sort()函式:templatevoid sort(pred pr):容器內所有元素根據預斷定函式pr排序
若要實現降序排序(降序方法之一),或自定義物件排序,需要使用判定函式。
降序:
#include #include using namespace std;
bool cmp(int a, int b)//比較函式:降序(改為return ab;
}int _tmain(int argc, _tchar* argv)
; list::iterator iterint;
listinttwo.sort(cmp);//使用cmp比較函式
for (iterint = listinttwo.begin(); iterint != listinttwo.end(); iterint++)
return 0;
}
排序
自定義物件(本例為結構體):
#include #include using namespace std;
struct node
;int cmpstruct(const node& node1, const node& node2)
int _tmain(int argc, _tchar* argv)
; node node2 = ;
node node3 = ;
node node4 = ;
listnode.push_back(node1);
listnode.push_back(node2);
listnode.push_back(node3);
listnode.push_back(node4);
list::iterator iterint;
listnode.sort(cmpstruct);//使用cmpstruct比較函式,降序排列結構體
for (iterint = listnode.begin(); iterint != listnode.end(); iterint++)
return 0;
}
輸出:
55,node2
23,node1
16,node4
3,node3
請按任意鍵繼續. . .
16 6 佇列queue容器
include includeusing namespace std include 3.6 queue容器 佇列queue是一種先進先出 first in first out,fifo 的資料結構,它有兩個出口 佇列容器允許從一端新增元素,從另一端移除元素 佇列中只有隊頭和隊尾才可以被外界使用,因...
佇列(一) 佇列的陣列實現方式
1.佇列的概念 佇列是一種特殊的線性表,只允許在佇列的一端進行插入而在另一端進行刪除。佇列一般擁有隊首 front指標 和隊尾 rear指標 當乙個佇列並未存入資料的時候,front和rear指標均指向隊首。入隊的操作 rear後移,存入資料在rear指向的單元,隊滿不可入隊,這同時也表明front...
佇列(一) 佇列的陣列實現方式
1.佇列的概念 佇列是一種特殊的線性表,僅僅同意在佇列的一端進行插入而在還有一端進行刪除。佇列一般擁有隊首 front指標 和隊尾 rear指標 當乙個佇列並未存入資料的時候,front和rear指標均指向隊首。入隊的操作 rear後移,存入資料在rear指向的單元,隊滿不可入隊,這同一時候也表明f...