STL 筆記(一): 順序容器 vector、list、deque

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.