STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)

1、Stack(棧)

  • 這個沒啥好說的,就是後進先出的一個容器。
  • 基本操做有:
1     stack<int>q;
2     q.push(1);   //入棧
3     q.pop();     //出棧
4     q.top();     //返回棧頂成員
5     q.size();    //返回棧成員個數
6     q.empty();   //判斷是否爲空棧

2、Queue(隊列)

  • 同上,先進先出的容器
  • 基本操做有:
1     queue<int>q;
2     q.push(1);    //入隊列
3     q.pop();      //出隊列
4     q.front();    //返回最上面(最後進入)的成員
5     q.size();     //返回隊列成員個數
6     q.empty();    //判斷是否爲空隊列

3、Priority_Queue(優先隊列)

  • priority_queue的模板生命是帶有三個參數的:priority_queue<type,container,function>
  • 和隊列差很少,不過每一個成員都有一個優先級參數,隊列按照優先級進行排序
  • 默認container是vector,默認function比較模式爲operator <(即棧頂爲最大值)。
  • 基本操做有:
1     priority_queue<int,vector<int>,greater<int> >q;
2     q.push(1);    //入優先隊列
3     q.top();      //返回優先隊列頭成員
4     q.pop();      //出優先隊列
5     q.size();     //返回優先隊列成員個數
6     q.empty();    //判斷是否爲空優先隊列
  • 內置的排序方式有greater<>,和less<>,不填此參數默認爲greater<>。固然也能夠本身構造優先級函數
  • 例如對結構體重載運算符:
1     struct node{
2         int x,y;
3         
4         //重載運算符,按x的值排優先級
5         friend operator < (node a,node b){
6             return a.x < b.x;
7         }
8     };
  • 也能夠將重載操做寫在外面,優先隊列中調用cmp函數
 1     struct node{
 2         int x,y;
 3     };
 4     struct cmp{
 5         //重載運算符,按x的值排優先級
 6         bool operator() (node a,node b){
 7             return a.x < b.x;
 8         }
 9     };
10 
11     priority_queue<node,vector<node>,cmp >q;

 

4、Deque(雙向隊列)

  • 一聽就知道和Queue差很少 ,特殊的是Deque但是擴充內存。咱們知道連續內存的容器不能隨意擴充,因此Deque也不是真正意義上的擴充內存。
  • Deque是由一段一段構成的,當走到尾端時自動跳到下一段,(支持迭代器++操做)。每次擴充,申請一個段,實現了內存連續的假象。
  • 基本操做有:
 1     int num[] = {1,2,3,4,5,6};
 2     deque<int>q;        //建立一個空雙向隊列
 3     deque<int>p(5);     //建立一個具備5個成員的雙向隊列
 4     deque<int>s(5,1);   //建立一個具備5個成員且初始值爲1的雙向隊列
 5     deque<int>s2(s);    //建立一個雙向隊列s2,並拷貝s中全部成員
 6     deque<int>n(num,num+5); //建立一個雙向隊列n,並拷貝num至num+5中元素入隊
 7     
 8     q.push_front(a);     //頭部入隊
 9     q.pop_back(b);     //尾部入隊
10     q.insert(iter,x);   //在iter位置插入x,iter爲迭代器
11     q.pop_front();       //頭部出隊
12     q.pop_back();      //尾部出隊
13     
14     q.front();          //返回頭成員
15     q.back();           //返回尾元素
16     q.size();           //返回雙向隊列成員個數
17     q.max_size();       //返回系統支持成員最大個數
18     q.empty();          //判斷雙向隊列是否爲空
19     
20     q.at(i);            //返回第i個元素
21     q.begin();          //返回頭部迭代器
22     q.end();            //返回尾部迭代器
23     q.rbegin();         //返回尾部反向迭代器
24     q.rend();           //返回頭部反向迭代器
25     
26     q.erase(iter);      //刪除iter元素,iter爲迭代器
27     q.clear();          //狀況雙向隊列
28     q.swap(p);          //交換q和p中的全部元素

 

  •  Deque採用分塊線型結構存儲數據,兩個迭代器分別指向首尾元素,並且擁有具備高效的push_back(),push_front()函數。
  •  正因如此,因此Deque不易實現capacity和reverse函數。
  • Deque的缺點:頻繁的插入刪除時候,Deque並不適合。

5、Vector(動態數組)

  • 顧名思義,不定長數組。
  • uhmmm沒啥好說的
  • 基本操做有:
 1     vector<int>q;           //建立空Vector
 2     vector<int>p(5);        //建立擁有5個成員的Vector
 3     vector<int>s(5,1);      //建立擁有5個成員,且初始值爲1的Vector
 4     vector<int>s2(s);       //建立s2,並拷貝s元素給s2
 5     vector<int>s3(s.begin(),s.end());   //建立s3,拷貝s.begin()至s.end()中元素給s3
 6     
 7     q.push_back(x);          //尾部加入元素
 8     q.insert(iter,x);        //在iter位置插入x,傳回新數據位置
 9     q.insert(iter,n,x);      //在iter位置插入n個x,無返回值
10     q.insert(iter,l,r);      //在iter位置插入[l,r)區間內的數據,無返回值
11     q.pop_back();            //刪除最後一個元素
12     q.front();               //返回第一個數據
13     q.back();                //返回最後一個數據
14 
15     q.size();                //返回容器內成員個數
16     q.resize(x);              //從新指定容器大小
17     q.empty();               //判斷Vector是否爲空
18     q.capacity();            //返回Vector可用空間的大小
19     q.reserve();             //從新指定空間大小,小於當前capacity時保持爲本來的capacity值
20     q.swap(p);               //交換p,q容器內元素
21     q.assign(iter1,iter2);   //將區間[iter1,iter2)內元素賦值給vector,並清空vector容器以前的內容。
22     q.assign(n,x);           //將n個x賦值到vector中,並清空vector容器以前的內容。
23     
24     q.at(i);                 //返回第i個元素
25     q.begin();               //返回頭位置迭代器
26     q.end();                 //返回尾位置迭代器
27     q.rbegin();              //返回尾部反向迭代器
28     q.rend();                //返回頭部反向迭代器
29 
30     q.clear();               //狀況Vector
31     q.erase();               //刪除iter位置元素
32     q.erase(iter1,iter2);    //刪除[iter1,iter2)區間內的元素
  • 此外,vector還能夠用數組的方式引用,由於以及內置重載了[],例如q[0]等同於q.at(1)。

6、List(鏈表)

  • 鏈表其實用的很少
  • 本身也沒怎麼用過 =7= 直接放代碼操做了
  • 基本操做:
 1     list<int>q;           //建立空List
 2     list<int>p(5);        //建立擁有5個成員的List
 3     list<int>s(5,1);      //建立擁有5個成員,且初始值爲1的List
 4     list<int>s2(s);       //建立s2,並拷貝s元素給s2
 5     list<int>s3(s.begin(),s.end());   //建立s3,拷貝s.begin()至s.end()中元素給s3
 6 
 7     q.back()                 //返回最後一個元素 
 8     q.begin()                //返回指向第一個元素的迭代器 
 9     q.clear()                //刪除全部元素 
10     q.empty()                //若是list是空的則返回true 
11     q.end()                  //返回末尾的迭代器 
12     q.erase()                //刪除一個元素 
13     
14     q.front()                //返回第一個元素 
15     q.get_allocator()        //返回list的配置器 
16     q.insert()               //插入一個元素到list中 
17     q.max_size()             //返回list能容納的最大元素數量 
18     q.merge()                //合併兩個list 
19     q.pop_back()             //刪除最後一個元素 
20     q.pop_front()            //刪除第一個元素 
21     q.push_front()           //在list的頭部添加一個元素 
22     
23     q.rbegin()               //返回指向第一個元素的逆向迭代器 
24     q.remove()               //從list刪除元素 
25     q.remove_if()            //按指定條件刪除元素 
26     q.rend()                 //指向list末尾的逆向迭代器 
27     q.resize()               //改變list的大小 
28     q.reverse()              //把list的元素倒轉 
29     q.size()                 //返回list中的元素個數 
30     q.sort()                 //給list排序 
31     q.splice()               //合併兩個list 
32     q.swap()                 //交換兩個list 
33     q.unique()               //刪除list中重複的元素

7、Pair(對)

  • 就是合成兩個數據,這個用結構體模擬也行,可是直接使用Pair會方便不少
  • 基本操做以下:
1     pair<int,int>q;     //建立一個空對
2     pair<int,int>p(2,3);//建立一個對p,並分別賦值2,3
3     pair<int,int>s(p);  //建立一個對s,拷貝p給s
4     
5     //賦值利用make_pair函數
6     q = make_pair(1,2);
7     //訪問pair內元素操做
8     q.first;        //返回成員第一個數據
9     q.second;       //返回成員第二個數據

8、Set(集合)

  • 首先Set遵循數學集合三特性,無重複、無序性、肯定性。我就不解釋了。
  • Set中內置紅黑樹進行排序,因此插入刪除效率很高。
  • 經常使用操做以下:
 1     int a[] = {1,2,3,4,5};
 2     set<int>q;
 3     set<int>p;
 4     
 5     q.insert(x);      //集合中插入元素
 6     q.insert(a,a+5);  //插入數組a至a+5的元素
 7     q.find(x);        //返回x值位置的迭代器,找不到返回q.end()  
 8     q.erase(iter);    //刪除集合中的元素
 9     q.size();         //返回當前set容器中的元素個數
10     q.count();        //返回某個值元素的個數(根據set的特性,就是判斷這個元素在不在,返回0或1)
11     q.begin();        //返回頭位置迭代器
12     q.end();          //返回尾位置迭代器
13     q.rbegin();       //返回尾部反向迭代器
14     q.rend();         //返回頭部反向迭代器
15     q.clear();        //刪除set容器中的全部的元素
16     q.empty();        //判斷set容器是否爲空
17     q.lower_bound();  //返回指向大於(或等於)某值的第一個元素的迭代器
18     q.upper_bound();  //返回大於某個值元素的迭代器
  • 固然,你也能夠自定義Set內部的排序操做,例如:
1     struct cmp{
2         bool operator() (const node &a,const node &b){
3             return a.x < b.x;
4         }
5     };
6     
7     set<node,cmp>q;

9、Map

  • 不知道該翻譯成啥,乾脆不翻譯了 =7=
  • map是一種關聯容器,例如map<int,int>,第一個元素能夠稱爲關鍵字,相似數組的下標,不會重複出現,而第二個元素爲關鍵字的值,相似數組中存的元素,能夠重複。
  • map不能直接修改關鍵字,只能經過修改關鍵字的值間接修改關鍵字。
  • 和Set同樣,map也是內置紅黑樹對關鍵字進行排序。可以實現快速查找和刪除功能。
  • 基本操做:
 1     map<int,int>q;
 2     
 3     q.insert(pair<int,int>(1,2));       //經過pair進行插入操做
 4     q.insert(map<int,int>::value_type (1,2));//經過value_type進行插入
 5     q[1] = 2;           //用數組方式進行插入
 6     /*三者不一樣的是,當map存在這個關鍵字時
 7      *數組方式會覆蓋關鍵字的值,而insert操做沒法插入。
 8     */
 9     
10     q.size();       //返回容器內元素個數
11     q.empty();      //判斷容器是否爲空 
12     q.begin();      //返回頭位置迭代器
13     q.end();        //返回尾位置迭代器
14     q.rbegin();     //返回尾部反向迭代器
15     q.rend();       //返回頭部反向迭代器
16     q.find(key);    //查找並返回關鍵字key的位置
17     q.count(key);   //查詢是否有關鍵字key(有則返回1,不然0)
18     q.lower_bound();//返回鍵值>=給定元素的第一個位置
19     q.upper_bound();//返回鍵值>給定元素的第一個位置
20     q.erase(iter);  //刪除迭代器iter的元素
21     q.erase(iter1,iter2);//刪除[iter1,iter2)區間內的元素
22     q.erase(key);   //刪除關鍵字爲key的元素
23     q.clear();      //清空容器
24     q.swap(p);      //交換兩個map
25     q.key_comp();   //返回比較元素key的函數
26     q.max_size();   //返回能夠容納的最大元素個數
27     q.value_comp(); //返回比較元素value的函數
28     q.equal_range();//返回特殊條目的迭代器對
  • 固然你能夠本身寫內部排序函數
  • 例如結構體中重載<號,或者編寫仿函數,例如:
1 class sort{
2 
3 public:
4     bool operator() (node const &a,node const &b) const{
5         return a.x < b.x;
6     }
7 
8 };

10、Multiset(多重集合)

  • 和Set不一樣的地方是Multiset容許一個值出現屢次;
  • 操做和set相同。可是由於值能重複出現,全部某些函數的返回值將會改變,例如:
  • multiset::count(key)返回值可能大於1;(多個關鍵值存在)
  • multiset::erase(key)會將對應的key所有刪掉。
  • 對於set老是有set::equal_range(key)的返回值總有++iter1 = iter2.但multiset不必定(元素相同)

11、Multimap

  • 同上,和map相似,能夠存在相同的關鍵字。

 

原本想講BitSet,可是以爲bitset比較特殊,到時候專門詳細講吧。node

 

其實全部容器都挺簡單的,根據特性基本都能想出操做。熟悉了這些容器以後,對作題和學習頗有幫助的。數組

記住操做沒啥用,得不斷的練習使用這些容器 ,才能熟練操做。less

 

emmmm都說的很簡陋,原本想講每一個容器的具體實現一塊兒構造方式。後來一想,篇幅太長了,還容易誤導別人以爲容器很複雜。這些都算是學個表面吧,最重要的仍是不斷敲敲敲,熟悉各類用法。函數

 

大體就這樣吧 =7=學習


 後續:Stack,Queue,Pair並非C++的標準容器,可是我以爲性質差很少,就一塊兒講了,可是防止誤導初學者,這裏仍是提一下。spa

相關文章
相關標籤/搜索