在C++裡面的函式中,有一些內建好用資料結構,這些資料結構都是用一種叫型別模板(template)的東西去包裝,而這些資料結構包裝起來就變成了標準模板庫(standard template library)
那STL裡面有什麼呢?
首先我們先來講解STL的三大容器 vector、deque跟list
原生C++的陣列是使用一連串的記憶體位置來儲存資料,但是當我們宣告完陣列大小後就沒辦法再修改了。
這時候我們就可以用STL裡的vector!!
vector簡單來講就是一個可以變長變短的陣列。在某些情況下,可以伸縮的陣列在解題上可以方便許多。
首先,我們來宣告一個vector,以下是一些常見的vector宣告方法
如果我們已經知道資料的大小是多少的話,就可以把vector當一般陣列一樣。
那如果我們不知道要輸入多大的資料,我們可以使用push_back(emplace_back)來自動新增元素並配置記憶體到vector的尾端
push_back跟emplace_back是差不多的東西,但在某些地方上有些微的不同
以pair當作例子來看
push_back是先建構一個臨時的物件,複製到容器尾端裡後再釋放臨時物件的記憶體
而emplace_back是直接呼叫建構函式建構在容器尾端
所以通常emplace_back的效率會比push_back還來的好
以下是vector常用的操作
vec.size()
回傳vector的大小
vec.reserve(size)
預留size大小的空間 如果要重新配置記憶體 ,否則
vec.empty()
回傳一個布林值,如果vector是空的就回傳true,否則回傳false,
vec.clear()
清空vector,
以下兩種是vector的遍歷方式
可以看個人喜好或是情況來決定要用哪一種遍歷方式
vector的迭代器是屬於隨機存取迭代器,所以說我們可以把兩個vector的指標做運算,再搭配二分搜求出任一個數字在第幾個位置
迭代器也可以拿來遍歷vector
vector也可以拿來當作連接串列,用來存圖上的邊和權重
vector在配置記憶體時蠻花時間的,如果確定好大小的話,先reserve()後再用push_back,效率會比較好
TOJ 575
zerojudge b298 (vector + queue)
deque 念法(ㄉㄟˋㄎㄜˇ )
中文叫雙向隊列
宣告寫法
簡單來講就是可以在首尾新增、刪除元素的vector
大致上跟vector差不多,所以就直接講用途
dq.push_front()
在最前面放入元素
dq.push_back()
在最後面放入元素
dq.pop_front()
移除前面的元素
dq.pop_back()
移除後面的元素
dq.front()
回傳最前面的元素
dq.back()
回傳最後面的元素
dq.size()
回傳deque的大小
dq.empty()
回傳一個bool,如果為空true,否則false
同樣的也可以像vector一樣用emplace來壓常數
跟vector一樣也是隨機存取迭代器,所以也可以把兩個迭代器指標做運算
sliding window
DP的單調對列優化
deque雖然比vector的功能還要來的多,但是deque卻比vector還要慢很多,所以能用vector達成的盡量用vector來達成。
後面提到的適配器(Container Adapters)很多內建也都是deque,所以我們可以把那適配器容器改成vector來增加效率。
STL的list是由一種叫連結串列(linked-list)來包裝
但是list其實在競程中沒有很常用到
而且在解題時我們也可以用陣列+struct來取代list
如果想要知道更多list的內容的話可以看這篇文章
一種先進後出的資料結構,由資料的同一端開口加入資料(push)或刪除資料(pop)。
生活上的例子:賣場的推車(由同個方向加入推車或拿走推車)
與stack語法類似,最大的不同是stack是後進先出,而queue則是先進先出