<style>
.reveal .slides {
text-align: left;
font-size:30px;
}
</style>
## STL
----
<div style="font-size:30px">
- STL
- pair / tuple
- vector
- iterator
- priority_queue
- stack / queue
- set / multiset
- map / multimap
</div>
----
### pair
常用來儲存一組的資料(Ex:平面上的(x,y))
* 宣告
```cpp
pair<int,int>
pair<double,int>
```
* 取值
```cpp=
pair<int,int> a
a.first (可以取到第一個值)
a.second (可以取到第二個值)
```
----
### vector
```cpp=
#include <vector>
//宣告
vector<int> v;
vector<int> v(n,m); n:陣列開的大小, m:想要陣列初始化的值
vector<vector<int>> v; vector二維陣列
```
----
- 常用函式: push_back , pop_back , size , empty , begin , end clear, resize, assign
```cpp=
#include <iostream>
#include <vector> // vector 的標題檔
using namespace std;
int main() {
vector<int> v;
//宣告一個 vector 名稱叫 v 用來裝 int 元素
for (int i=1; i<=5; i++) v.push_back(i);
for (int i=5; i>=1; i--) v.push_back(i);
cout << v.size() << "\n";
for (int i=1; i<=4; i++) v.pop_back();// 將 vector 尾端元素刪掉
cout << v.size() << "\n";
cout << v.empty() << "\n";
// empty() 函式為查詢 vector 裡面是否有元素
// 回傳值為 bool
v.clear();
}
```
----
- vector可以使用iterator來遍歷,你可以把iterator想成是類似指標的東西!
```cpp=
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vt;
vector<int>::iterator iter;
for (int i=95; i<=100; i++) {
vt.push_back(i);
}
iter = vt.begin();
for(iter = vt.begin(); iter != vt.end(); iter++) {
cout << *iter << "\n";
// 一定要 「 * 」 號
}
}
```
----
### stack
一種先進後出的資料結構,先放進去的會最慢拿出來
- stack的常用函式 : push , size , empty , top , pop
- 不支援隨機存取:O(N) 查找速度慢:O(N) 在集合中增刪元素很快:O(1)
----
實際演練:
```cpp=
#include <iostream>
#include <stack> // stack 的標題檔
using namespace std;
int main() {
stack<int> Stk;
//宣告一個 stack 名稱叫 stk 用來裝int元素
for (int i=4; i<=10; i++) {
Stk.push(i);
}
cout << Stk.top() << "\n";
// 輸出 stack 最上層的元素,所以會輸出 10
Stk.pop();
// 刪除 stack 最上層的元素
cout << Stk.top() << "\n"; //9
cout << "裡面有多少元素" <<Stk.size() << "\n";
// 查詢 stk 裡面有幾個元素,裡面元素有 4 5 6 7 8 9共六個,所以會輸出 6
cout << Stk.empty() << "\n";
// empty() 函式為查詢 stack 裡面是否有元素
// 回傳值為bool
//清除 stack的元素
while(Stk.size() != 0) { // 或是 while(Stk.empty == 0)
Stk.pop(); //O(N)
}
cout << "裡面有多少元素" << Stk.size() << "\n";
cout << Stk.empty() << "\n";
}
```
----
# stack的超經典題!
括號配對
判斷一串括號"{}","()","[]"是否都能成功配對
想法:
- 有左括號就一定有右括號
- 越晚出現的左括號,其所對應的右括號就越早出現!
----
### queue
一種先進先出的資料結構
- queue的常用函式 : push , size , empty , front , pop .
- 不支援隨機存取:O(N) 查找速度慢:O(N) 在集合中增刪元素很快:O(1)
----
實際演練:
```cpp=
#include <iostream>
#include <queue> // queue 的標題檔
using namespace std;
int main() {
queue<int> que;
//宣告一個 queue 名稱叫 que 用來裝int元素
//一開始裡面的容器是空的
for (int i=4; i<=10; i++) {
que.push(i);
}
cout << que.front() << "\n";
// 輸出 queue 最上層的元素,所以會輸出 4
que.pop();
// 刪除 queue 最上層的元素
cout << que.front() << "\n";
// 輸出 queue 最上層的元素,所以會輸出 5
cout << "裡面有多少元素" <<queue.size() << "\n";
// 查詢 queue 裡面有幾個元素,裡面元素有 5 6 7 8 9 10共六個,所以會輸出 6
cout << que.empty() << "\n";
// empty() 函式為查詢 queue 裡面是否有元素
// 回傳值為bool 1 裡面沒有元素 0 則是
//清除 queue的元素
while(que.size() != 0) { // 或是 while(que.empty == 0)
que.pop();
}
cout << "裡面有多少元素" << que.size() << "\n";
cout << que.empty() << "\n";
}
```
----
### priority queue
排序過後的queue,其原理是用heap去排序
----
priority_queue 的常用函式 : push , size , empty , *top , pop .
----
實際演練:
```cpp=
#include <queue>
priority_queue<int> pq;
priority_queue<int, vector<int>, greater<int> > pq1; //從小到大 變成min_heap
pq.push(5);
pq.push(8);
pq.push(4);
// 元素可重複,會個別保留
pq.push(5);
cout << pq.size() << "\n";
cout << pq.top() << "\n";
pq.pop();
cout << pq.size() << "\n";
cout << pq.top() << "\n";
cout << pq.empty() << "\n";
```
----
### set
```
#include<set>
```
----
- set 是有序的,對 set 遍歷時,會以定義的大小順序遍歷,預設是由小到大
- 大多數操作皆為 $O(\log N)$
- set 的常用函式:insert, erase, count, size, empty, begin, end, lower_bound, upper_bound
----
實際演練
```cpp
set<int> s; // []
s.insert(1); // s = [1]
s.insert(3); // s = [1, 3]
s.insert(1); // s = [1, 3]
s.erase(3); // s = [1, 3]
s.count(3) // return 1代表3有在集合內
s.count(4) // return 0
//找最大/最小值
cout << *s.begin() << endl;
cout << *s.rbegin() << endl;
```
----
### map
```
#include<map>
```
映射,基本上就是多了個對應值的set,單位型態為 pair<key,value>
用法跟 set 很像,但多了 operator[] 可以取值或存值。
----
* 大多操作皆為 $O(\log n)$
* map 的常用函式:insert, erase, count, size, empty, begin, end, lower_bound, upper_bound.
----
### 使用範例:
```cpp
map<int, int> mp;
mp[3] = 1; //[3] = 1,
mp[2] = 2; //[2] = 2, [3] = 1;
mp[3] = 5; //[2] = 2, [3] = 5;
```
<!-- 加個 string 當 key 的粒子-->
---
常和STL搭配的一些function
----
sort
```cpp
#include<algorithm>
```
- 排序區間 [l, r) 的資料,複雜度為 $O(n\log n)$
- l, r 為指標或者迭代器
### 範例
```cpp=
#include<iostream>
#include<algorithm> // sort
int arr[48763]={4, 8, 7, 6, 3};
int main(){
sort(arr,arr+5);
// 3 4 6 7 8
}
```
----
自訂比較關係
傳入兩個參數做為比較對象
lhs代表左邊的元素,
rhs代表右邊的元素
```cpp=
#include<iostream>
#include<algorithm> // sort
bool cmp(int lhs, int rhs){ // compare function
return lhs > rhs;
}
int arr[5] = {3, 2, 7};
int main(){
sort(arr, arr+3, cmp);
}
```
---
STL更多補充:
https://hackmd.io/@LeeShoWhaodian/STLandfunction
https://hackmd.io/@konchin/book/%2FuX4pl05vRpKAgiuR0XHi_g
{"contributors":"[{\"id\":\"5e6080ad-2252-4aaf-a7b5-41cf335c82b0\",\"add\":5434,\"del\":27}]","title":"STL","description":""}