C++STL 容器篇


前言

上一章節主要是詳細介紹了C++泛型編程基礎,不清楚的能夠回顧一下哦。本章節主要針對於C++STL(標準模板類庫)作個詳細介紹。標準模板類庫也就是別人寫的模板類,主要內容是各類數據結構的封裝,以及經常使用算法。暫時分三個章節介紹,本章節主要介紹容器篇。c++

容器總括

序列式容器(sequence containers)算法

  • array(c++11以上版本) : 定長數組。編程

  • vector : 動態數組。數組

  • vector<bool> : vector的bool特化。微信

  • forward_list(c++11以上版本) : 單鏈表。數據結構

  • list :雙向鏈表。app

  • deque:雙端動態數組。編輯器

關聯式容器(associative containers)函數

  • set(multiset) : 有序集合,鍵和值相同。測試

  • map(multimap) : 有序集合,鍵對應值。

哈希表(hash table) (c++11以上版本)

  • unordered_set(unordered_multiset)(c++11以上版本: 無序集合,key == value, 特性與unordered_map相似

  • unordered_map(unordered_multimap)(c++11以上版本: 無序集合,單獨訪問某個元素較快,從頭至尾遍歷效率會低於map

容器適配器(container adapters)

  • stack : 棧

  • queue : 隊列

  • priority_queue : 優先隊列

  • bitset : 位組

本章節主要介紹如下幾種容器的基本用法:

適配器容器

由於這些容器都是基於其餘標準容器實現的因此叫作容器的適配器,具體的有stack,queue,priority_queue,默認的狀況下,stack和queue基於deque而實現的,priority_queue在vector上實現的,能夠根據第二個實參指定容器的類型,但必定要符合標準,queue要求要有push_front操做所以不能創建在vector上面,priority_front要求有隨機訪問的功能,所以創建在vector上面。優先級隊列默認狀況下是大頂堆,也就是大者優先級高,後面能夠自定義優先級比較規則,固然這些東西你們瞭解一下便可,更可能是掌握這些適配器容器的使用。

1
stack容器

stack是棧結構,棧是一種FILO(先進後出)結構,從容器中拿數據必須按照FILO的方式。stack主要成員函數有如下幾個:

  1. empty():棧爲空則返回真

  2. pop(): 移除棧頂元素

  3. push(): 在棧頂增長元素

  4. size(): 返回棧中元素數目

  5. top(): 返回棧頂元素

使用實例代碼以下:求解一個數字的二進制

2
queue容器

queue是隊列結構,隊列是一種FIFO(先進先出)結構,從容器中拿數據必須按照FIFO的方式。queue主要成員函數有如下幾個:

  1. empty():隊列爲空則返回真

  2. pop(): 移除隊頭元素

  3. push(): 在隊尾增長元素

  4. size(): 返回隊中元素數目

  5. front(): 返回隊頭元素

使用實例代碼以下:描述點贊,轉發,評論 三連操做

3
priority_queue容器

priority_queue是優先隊列,通常咱們都須要本身重寫比較準則,相對於上面兩種容器來講稍微麻煩一點。優先隊列具備隊列的全部特性,包括隊列的基本操做,只是在這基礎上添加了內部的一個排序,它本質是一個堆實現的。主要成員函數和queue基本差很少,主要有如下幾個:

  1. top():訪問隊頭元素

  2. empty():隊列是否爲空

  3. size(): 返回隊列內元素個數

  4. push(): 插入元素到隊尾 (並排序)

  5. emplace(): 原地構造一個元素並插入隊列

  6. pop(): 彈出隊頭元素

  7. swap():交換內容

優先隊列主要用來作大頂堆和小頂堆使用,由於出隊是根據優先權去出隊的。案例代碼以下:

priority_queue <int, vector<int>, greater<int> >

int: 操做的數據類型

vector<int>: 操做的容器

greater<int>: 比較準則 大於 

在優先隊列操做自定義類型的時候一般是重寫比較準則來實現排序效果。這個必定要注意。

序列式容器

所謂序列容器,即以線性排列(相似普通數組的存儲方式)來存儲某一指定類型(例如 int、double 等)的數據,須要特殊說明的是,該類容器並不會自動對存儲的元素按照值的大小進行排序。須要注意的是,序列容器只是一類容器的統稱,並不指具體的某個容器,本文序列式容器只介紹array,vector,以及list。

1
array容器

array是定長數組,此類容器一旦創建,其長度就是固定不變的,這意味着不能增長或刪除元素,只能改變某個元素的值,案例代碼以下:

2
vector容器

vector是動態數組,在沒有肯定數組長度的時候,不能採用下標法進行插入元素,只能採用push_back的成員函數進行插入元素,vector經常使用成員函數以下:

  1. assign(beg,end):賦值區間[beg,end]元素到容器

  2. assign(n,elem):n個elem複製到容器

  3. at(index): 訪問index序號的元素

  4. clear(): 清除容器中的元素

  5. erase(index): 刪除index序號的元素

  6. empty(): 判斷容器是否爲空

  7. push_back(elem):尾部插入元素elem

  8. size():容器元素個數

  9. back():容器最後一個元素

動態數組vector和數組相似,並非很複雜,案例代碼以下:

3
list容器

list容器是雙向鏈表,相似於C語言中寫的雙向鏈表,操做很簡單,經常使用成員函數以下:

  1. front():鏈表頭部元素

  2. back():鏈表尾部元素

  3. size(): 鏈表中元素個數

  4. empty(): 鏈表是否爲空

  5. push_back(elem): 尾插法

  6. push_front(elem): 頭插法

  7. pop_back:尾刪法

  8. pop_front(): 頭插法

  9. insert(iter): 指定位置插入

  10. erase(iter):指定位置刪除

  11. merage(list): 合併

  12. sort():排序

  13. assign(beg,end):區間 [beg,end]元素複製到鏈表

list的使用基本和本身的些的鏈表使用差很少,只是函數已被封裝。以下案例:

關聯式容器

關聯式容器存儲的元素,都是一個一個的「鍵值對」( <key,value> ),這是和序列式容器最大的不一樣。除此以外,序列式容器中存儲的元素默認都是未通過排序的,而使用關聯式容器存儲的元素,默認會根據各元素的鍵值的大小作升序排序。關聯式容器所具有的這些特性,歸咎於 STL 標準庫在實現該類型容器時,底層選用了 紅黑這種數據結構來組織和存儲各個鍵值對。

1
set容器

set容器能夠理解爲集合,對於set集合通常是key和value是相等的,因此存儲的數據沒有對應的關係,存儲的數據通常是有序的,對於set來講還有相對應的多重集合 multiset,set集合不容許重複的數據,multiset容許重複的數據,它們使用的成員函數基本是差很少的。主要成員函數以下:

  1. insert(elem):插入elem

  2. begin():容器開始位置

  3. end(): 容器結束位置

  4. size(): 容器中元素個數

  5. erase(iter): 刪除容器中iter指向的元素

對於set集合插入元素後會自帶排序功能,默認排序方式是從小到大, 能夠經過修改排序準則調整排序方式。set<int,greater<int>> object,構造集合對象的時候加入排序準則便可,或者重寫也能夠。集合測試案例代碼以下:

2
map容器

map容器能夠理解爲單映射,操做的數據類型是數對類型,即pair<type1,type2>類型,pair數據有兩個成員 first(鍵)和second(值),而map的排序是根據鍵排序的。一樣也存在多重映射,區別在於多重映射容許相同的鍵的數據存在。而單映射不容許。數組其實能夠理解爲下標與值的對應關係,而映射是是拓展版的下標對應值的關係,由於它不侷限於整數的鍵。對於映射經常使用成員函數以下:

  1. insert(pair<type,type>elem):插入數對elem

  2. begin():容器開始位置

  3. end(): 容器結束位置

  4. size(): 容器中元素個數

  5. erase(iter): 刪除元素

在單映射中能夠採用數組形態方式進行插入元素,可是多重映射不容許的,案例代碼以下:


尾言

本欄目到這裏結束了,關於迭代器內容咱們單獨一章節講解,做業:採用STL去操做自定義類型數據。難度不大,重在重載。



本文分享自微信公衆號 - C語言編程基礎(goodStudyCode)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索