用法 stl_C++STL 容器篇
前言
上一章節(jié)主要是詳細介紹了C++泛型編程基礎(chǔ),不清楚的可以回顧一下哦。本章節(jié)主要針對于C++STL(標準模板類庫)做個詳細介紹。標準模板類庫也就是別人寫的模板類,主要內(nèi)容是各種數(shù)據(jù)結(jié)構(gòu)的封裝,以及常用算法。暫時分三個章節(jié)介紹,本章節(jié)主要介紹容器篇。
容器總括
序列式容器(sequence containers)
array(c++11以上版本)?: 定長數(shù)組。
vector?: 動態(tài)數(shù)組。
vector?: vector的bool特化。
forward_list(c++11以上版本)?: 單鏈表。
list?:雙向鏈表。
deque:雙端動態(tài)數(shù)組。
關(guān)聯(lián)式容器(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?: 優(yōu)先隊列
bitset?: 位組
本章節(jié)主要介紹以下幾種容器的基本用法:
適配器容器
因為這些容器都是基于其他標準容器實現(xiàn)的所以叫做容器的適配器,具體的有stack,queue,priority_queue,默認的情況下,stack和queue基于deque而實現(xiàn)的,priority_queue在vector上實現(xiàn)的,可以根據(jù)第二個實參指定容器的類型,但一定要符合標準,queue要求要有push_front操作因此不能建立在vector上面,priority_front要求有隨機訪問的功能,因此建立在vector上面。優(yōu)先級隊列默認情況下是大頂堆,也就是大者優(yōu)先級高,后面可以自定義優(yōu)先級比較規(guī)則,當然這些東西大家了解一下即可,更多是掌握這些適配器容器的使用。
1stack容器stack是棧結(jié)構(gòu),棧是一種FILO(先進后出)結(jié)構(gòu),從容器中拿數(shù)據(jù)必須按照FILO的方式。stack主要成員函數(shù)有以下幾個:
empty():棧為空則返回真
pop(): 移除棧頂元素
push(): 在棧頂增加元素
size(): 返回棧中元素數(shù)目
top(): 返回棧頂元素
使用實例代碼如下:求解一個數(shù)字的二進制
2queue容器queue是隊列結(jié)構(gòu),隊列是一種FIFO(先進先出)結(jié)構(gòu),從容器中拿數(shù)據(jù)必須按照FIFO的方式。queue主要成員函數(shù)有以下幾個:
empty():隊列為空則返回真
pop(): 移除隊頭元素
push(): 在隊尾增加元素
size(): 返回隊中元素數(shù)目
front(): 返回隊頭元素
使用實例代碼如下:描述點贊,轉(zhuǎn)發(fā),評論 三連操作
3priority_queue容器priority_queue是優(yōu)先隊列,一般我們都需要自己重寫比較準則,相對于上面兩種容器來說稍微麻煩一點。優(yōu)先隊列具有隊列的所有特性,包括隊列的基本操作,只是在這基礎(chǔ)上添加了內(nèi)部的一個排序,它本質(zhì)是一個堆實現(xiàn)的。主要成員函數(shù)和queue基本差不多,主要有以下幾個:
top():訪問隊頭元素
empty():隊列是否為空
size(): 返回隊列內(nèi)元素個數(shù)
push(): 插入元素到隊尾 (并排序)
emplace(): 原地構(gòu)造一個元素并插入隊列
pop(): 彈出隊頭元素
swap():交換內(nèi)容
優(yōu)先隊列主要用來做大頂堆和小頂堆使用,因為出隊是根據(jù)優(yōu)先權(quán)去出隊的。案例代碼如下:
priority_queue , greater >
int: 操作的數(shù)據(jù)類型
vector: 操作的容器
greater: 比較準則 大于?
在優(yōu)先隊列操作自定義類型的時候通常是重寫比較準則來實現(xiàn)排序效果。這個一定要注意。
序列式容器
所謂序列容器,即以線性排列(類似普通數(shù)組的存儲方式)來存儲某一指定類型(例如 int、double 等)的數(shù)據(jù),需要特殊說明的是,該類容器并不會自動對存儲的元素按照值的大小進行排序。需要注意的是,序列容器只是一類容器的統(tǒng)稱,并不指具體的某個容器,本文序列式容器只介紹array,vector,以及l(fā)ist。
1array容器array是定長數(shù)組,此類容器一旦建立,其長度就是固定不變的,這意味著不能增加或刪除元素,只能改變某個元素的值,案例代碼如下:
2vector容器vector是動態(tài)數(shù)組,在沒有確定數(shù)組長度的時候,不能采用下標法進行插入元素,只能采用push_back的成員函數(shù)進行插入元素,vector常用成員函數(shù)如下:
assign(beg,end):賦值區(qū)間[beg,end]元素到容器
assign(n,elem):n個elem復制到容器
at(index): 訪問index序號的元素
clear(): 清除容器中的元素
erase(index): 刪除index序號的元素
empty(): 判斷容器是否為空
push_back(elem):尾部插入元素elem
size():容器元素個數(shù)
back():容器最后一個元素
動態(tài)數(shù)組vector和數(shù)組類似,并不是很復雜,案例代碼如下:
3list容器
list容器是雙向鏈表,類似于C語言中寫的雙向鏈表,操作很簡單,常用成員函數(shù)如下:
front():鏈表頭部元素
back():鏈表尾部元素
size(): 鏈表中元素個數(shù)
empty(): 鏈表是否為空
push_back(elem): 尾插法
push_front(elem): 頭插法
pop_back:尾刪法
pop_front(): 頭插法
insert(iter): 指定位置插入
erase(iter):指定位置刪除
merage(list): 合并
sort():排序
assign(beg,end):區(qū)間 [beg,end]元素復制到鏈表
list的使用基本和自己的些的鏈表使用差不多,只是函數(shù)已被封裝。如下案例:
關(guān)聯(lián)式容器
關(guān)聯(lián)式容器存儲的元素,都是一個一個的“鍵值對”( ),這是和序列式容器最大的不同。除此之外,序列式容器中存儲的元素默認都是未經(jīng)過排序的,而使用關(guān)聯(lián)式容器存儲的元素,默認會根據(jù)各元素的鍵值的大小做升序排序。關(guān)聯(lián)式容器所具備的這些特性,歸咎于 STL 標準庫在實現(xiàn)該類型容器時,底層選用了?紅黑樹這種數(shù)據(jù)結(jié)構(gòu)來組織和存儲各個鍵值對。
1set容器set容器可以理解為集合,對于set集合一般是key和value是相等的,所以存儲的數(shù)據(jù)沒有對應的關(guān)系,存儲的數(shù)據(jù)一般是有序的,對于set來說還有相對應的多重集合 multiset,set集合不允許重復的數(shù)據(jù),multiset允許重復的數(shù)據(jù),它們使用的成員函數(shù)基本是差不多的。主要成員函數(shù)如下:
insert(elem):插入elem
begin():容器開始位置
end(): 容器結(jié)束位置
size(): 容器中元素個數(shù)
erase(iter): 刪除容器中iter指向的元素
對于set集合插入元素后會自帶排序功能,默認排序方式是從小到大, 可以通過修改排序準則調(diào)整排序方式。set> object,構(gòu)造集合對象的時候加入排序準則即可,或者重寫也可以。集合測試案例代碼如下:
2map容器map容器可以理解為單映射,操作的數(shù)據(jù)類型是數(shù)對類型,即pair類型,pair數(shù)據(jù)有兩個成員 first(鍵)和second(值),而map的排序是根據(jù)鍵排序的。同樣也存在多重映射,區(qū)別在于多重映射允許相同的鍵的數(shù)據(jù)存在。而單映射不允許。數(shù)組其實可以理解為下標與值的對應關(guān)系,而映射是是拓展版的下標對應值的關(guān)系,因為它不局限于整數(shù)的鍵。對于映射常用成員函數(shù)如下:
insert(pairelem):插入數(shù)對elem
begin():容器開始位置
end(): 容器結(jié)束位置
size(): 容器中元素個數(shù)
erase(iter): 刪除元素
在單映射中可以采用數(shù)組形態(tài)方式進行插入元素,但是多重映射不允許的,案例代碼如下:
尾言
本欄目到這里結(jié)束了,關(guān)于迭代器內(nèi)容我們單獨一章節(jié)講解,作業(yè):采用STL去操作自定義類型數(shù)據(jù)。難度不大,重在重載。
總結(jié)
以上是生活随笔為你收集整理的用法 stl_C++STL 容器篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学计算机专业的自荐信,浙江大学(计算机类
- 下一篇: C++学习之路 | PTA乙级—— 10