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