標籤:c++ stl
STL 容器類C++ STL 體現了泛型程式設計的思想,廣義上分為: 容器 (Container),迭代器 (Iterator),演算法 (Algorithm)。容器類可以包含一組相同類型或不同類型的對象,包含相同類型對象時稱為同類容器類,包含不同類型對象時,稱為異類容器類。容器類庫共包含 10 種容器,分為三類:
- 順序容器:向量 (vector)、雙端隊列 (deque)、列表 (list);
- 關聯容器:集合 (set)、多重集合 (multiset)、映射 (map)和多重新對應 (multimap);
- 容器適配器:棧 (stack)、隊列 (queue)和優先隊列 (priority queue);
STL 三種順序容器的特性對比:
- vector 可變數組,記憶體空間是連續的,容量不會進行縮減。支援高效隨機存取,即支援[]和at()操作。尾部插入刪除效率高,其他位置插刪效率較低;
- list 雙向鏈表,記憶體空間可不連續,不支援隨機存取。插入和刪除的效率很高;
- deque 雙端隊列,記憶體空間是多個連續的記憶體塊,在一個映射結構中儲存對這些塊以及順序的跟蹤,可利用的記憶體更大,且記憶體大小是可以自動縮減的。支援隨機存取,但是隨機存取效能沒有vector 好。首尾插入效率高,其他位置插刪效率低;
使用注意:
- 對於 vector 和 deque,使用隨機訪問時注意不要越界;
- 對於 vector 的非尾部插入刪除和 deque的非首尾插入刪除,會導致部分元素的移動,這是需要考慮之前正在用的迭代器、指標或索引是否需要調整;
vector 容器常用函數:
#構造:vector(): #建立一個空vectorvector(int nSize): #建立一個vector,元素個數為nSizevector(int nSize,const t& t): #建立一個vector,元素個數為nSize,且值均為tvector(const vector&): #複製建構函式vector(begin,end): #複製[begin,end)區間內另一個數組的元素到vector中#增刪:void push_back(const T& x): #向量尾部增加一個元素Xiterator insert(iterator it,const T& x): #向量中迭代器指向元素前增加一個元素xiterator insert(iterator it,int n,const T& x): #向量中迭代器指向元素前增加n個相同的元素xiterator insert(iterator it,const_iterator first,const_iterator last): #向迭代器指向元素前插入另一個相同類型向量的[first,last)間的資料iterator erase(iterator it): #刪除向量中迭代器指向元素iterator erase(iterator first,iterator last): #刪除向量中[first,last)中元素void pop_back(): #刪除向量中最後一個元素void clear(): #清空向量中所有元素#遍曆:reference at(int pos): #返回pos位置元素的引用reference front(): #返回首元素的引用reference back(): #返回尾元素的引用iterator begin(): #返迴向量頭指標,指向第一個元素iterator end(): #返迴向量尾指標,指向向量最後一個元素的下一個位置reverse_iterator rbegin(): #反向迭代器,指向最後一個元素reverse_iterator rend(): #反向迭代器,指向第一個元素之前的位置#功能:bool empty() const: #判斷向量是否為空白,若為空白,則向量中無元素int size() const: #返迴向量中元素的個數int capacity() const: #返回當前向量張紅所能容納的最大元素值int max_size() const: #返回最大可允許的vector元素數量值void swap(vector&): #交換兩個同類型向量的資料void assign(int n,const T& x): #設定向量中第n個元素的值為xvoid assign(const_iterator first,const_iterator last): #向量中[first,last)中元素設定成當前向量元素
list 容器常用函數:
#構造:list<Elem> c: #建立一個空的listlist<Elem> c1(c2): #複製另一個同類型元素的listlist<Elem>c(n): #建立n個元素的list,每個元素值由預設建構函式確定list<Elem>c(n,elem): #建立n個元素的list,每個元素的值為elemlist<Elem>c(begin,end): #由迭代器建立list,迭代區間為[begin,end)#增刪:void push_back(const T& x): #尾部增加一個元素xvoid push_front(const T& x): #首部添加一個元素Xvoid 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個相同元素xvoid 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(): #容器內所有元素排序,預設是升序template<class Pred>void 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(): #反轉容器中元素順序
deque容器常用函數
#構造deque(): #建立一個空dequedeque(int nSize): #建立一個deque,元素個數為nSizedeque(int nSize,const T& t): #建立一個deque,元素個數為nSize,且值均為tdeque(const deque &): #複製建構函式#增刪:void push_front(const T& x): #雙端隊列頭部增加一個元素Xvoid push_back(const T& x): #雙端隊列尾部增加一個元素xiterator insert(iterator it,const T& x): #雙端隊列中某一元素前增加一個元素xvoid insert(iterator it,int n,const T& x): #雙端隊列中某一元素前增加n個相同的元素xvoid insert(iterator it,const_iterator first,const_iteratorlast): #雙端隊列中某一元素前插入另一個相同類型向量的[forst,last)間的資料iterator erase(iterator it): #刪除雙端隊列中的某一個元素iterator erase(iterator first,iterator last): #刪除雙端隊列中[first,last)中的元素void pop_front(): #刪除雙端隊列中最前一個元素void pop_back(): #刪除雙端隊列中最後一個元素void clear(): #清空雙端隊列中最後一個元素#遍曆:reference at(int pos): #返回pos位置元素的引用reference front(): #返回手元素的引用reference back(): #返回尾元素的引用iterator begin(): #返迴向量頭指標,指向第一個元素iterator end(): #返回指向向量中最後一個元素下一個元素的指標(不包含在向量中)reverse_iterator rbegin(): #反向迭代器,指向最後一個元素reverse_iterator rend(): #反向迭代器,指向第一個元素的前一個元素#功能:bool empty() const: #向量是否為空白,若true,則向量中無元素int size() const: #返迴向量中元素的個數int max_size() const: #返回最大可允許的雙端對了元素數量值void swap(deque&): #交換兩個同類型隊列的資料void assign(int n,const T& x): #向量中第n個元素的值設定為x
小例子:關於 vector 的一個小例子
#include <iostream>#include <algorithm>#include <vector>using namespace std;void display(int val){ cout<< val <<' ';}int main(){ vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(i); } for_each(v.begin(), v.end(), display); // for_each 函數模版 cout<<"\nUse iterator\n"; vector<int>::iterator iter; for(iter = v.begin(); iter != v.end(); ++iter){ cout<< *iter << " "; } cout<<"---"<<v.at(9); cout<<"\nThis is an two-dimensional array\n"; vector< vector<int> > array; vector<int> line; for(int i = 0; i < 5; ++i){ array.push_back(line); for(int j = 0; j < 9; ++j){ array[i].push_back(j); } } for(int i = 0; i < 5; ++i){ for(int j = 0; j < array[i].size(); ++j){ cout<< array[i][j] <<" "; } cout<<endl; } return 0;}/* 結果:0 1 2 3 4 5 6 7 8 9Use iterator0 1 2 3 4 5 6 7 8 9 ---9This is an two-dimensional array0 1 2 3 4 5 6 7 80 1 2 3 4 5 6 7 80 1 2 3 4 5 6 7 80 1 2 3 4 5 6 7 80 1 2 3 4 5 6 7 8*/
STL 筆記(一): 順序容器 vector、list、deque