## STL
----
<style>
.reveal .slides {
text-align: left;
}
</style>
當我們遇到陣列沒辦法解決的超複雜實作題時...
----
### queue (佇列)
----
queue就像是放東西進水管一樣,**先進先出**。
(First In First Out) -> FIFO
----
常見操作有 :
* push : 把一個元素(element)加入到 queue 的尾巴。
* pop : 把頂端(第一個)元素移除。
* back : 得到尾巴的值。
* front : 得到頂端的值。
----

----
```cpp=
#include<iostream>
#include<queue>
using namespace std;
int main(){
queue<int> q; // 一個空的 queue
q.push(10);
q.push(20);
q.push(30); // [10, 20, 30]
cout << q.front() << endl; // 10
cout << q.back() << endl; // 30
q.pop(); // [20, 30]
cout << q.size() << "\n"; // 2
}
```
----
### stack (堆疊)
----
吃過壽司嗎?當我們吃完壽司後就會把碟子給疊起來,我們可以從這個行為發現,**先放下去的碟子,會最後被拿起來**。
----
常見的操作有 :
* top : stack 的頂端元素。
* push : 再放一個元素至 stack 的頂端。
* pop : 將一個元素從 stack 頂端給拿走。
----

----
```cpp=
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<int> s;
s.push(10); // | 30 |
s.push(20); // | 20 | 疊三個盤子
s.push(30); // |_10_| 10 在最下面
for(int i=0 ; i<s.size() ; i++){ // s.size() = 3
cout << s.top() << "\n"; // 輸出 30, 20,
s.pop();
}
}
```
----
### vector (向量)
----
如果我們不確定我們想要使用的陣列該開多少的空間,我們可以利用 vector ,他就像是 **動態的陣列**。
----
常見的操作有 :
* push_back : 把一個元素放到尾端。
* pop_back : 把尾端的元素移除。
* size() : vector 的長度(大小)。
----
最重要的是,vector 可以當成陣列來操作。
----

----
```cpp=
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vec; // 宣告一個裝 int 的 vector
// 現在 vec 是空的
vec.push_back(10);
vec.push_back(20); // 經過三次 push_back
vec.push_back(30); // vec 是 [10, 20, 30]
int length = vec.size(); // length = 3
for(int i=0 ; i<length ; i++){
cout << vec[i] << endl; // 輸出 10, 20, 30
}
}
```
----
### set (集合)
----
如何判斷一個陣列中有沒有某個數?
如何判斷兩個陣列中有幾個相同的數?
如何快速的把一個元素從陣列中拿掉?
----

----
常見的操作有 :
* insert : 把某個元素放進集合。
* erase : 把某個元素從集合中移除。
* count : 檢查某個元素是否存在集合裡面。
* clear : 把集合清空。
* empty : 檢查集合是否為空。
* size : 回傳集合的大小。
----
```cpp=
#include<iostream>
#include <set>
using namespace std;
int main(){
set<int> mySet;
mySet.insert(20); // mySet = {20}
mySet.insert(10); // mySet = {10, 20}
mySet.insert(30); // mySet = {10, 20, 30}
cout << mySet.count(20) << endl; // 存在 -> 1
cout << mySet.count(100) << endl; // 不存在 -> 0
mySet.erase(20); // mySet = {10, 30}
cout << mySet.count(20) << endl; // 0
}
```
----
### map (表)
----
一個東西對到一個東西,例如 :
* 你的座號對到你的姓名
* 你的名字對到你的存款
* ...
----

----
常見的操作 :
* count : 去確認是否有某個數在map裡面。
----
```cpp=
#include<iostream>
#include<map>
using namespace std;
int main(){
map<string, int> m; // 從 string 對應到 int
// 設定對應的值
m["one"] = 1; // "one" -> 1
m["two"] = 2; // "two" -> 2
m["three"] = 3; // "three" -> 3
cout << m.count("two") << endl; // 1 -> 有對應
cout << m.count("ten") << endl; // 0 -> 沒有對應
}
```
----
### pair
----
今天若有兩種屬性的串在再一起,除了 ```struct``` 和 ```class``` 外,我們還有 ```pair``` 這個好東西。
例如 : 一個點的```x```座標和```y```座標
----
常用的操作 :
* first : 第一個元素。
* second : 第二個元素。
----
```cpp=
#include<iostream>
#include<utility>
using namespace std;
int main()
{
pair<int, int> point[10];
for(int i=0;i<10;i++)
cin >> point[i].first >> point[i].second;
return 0;
}
```
----
當然,這些```STL(容器)```,都是可以串聯在一起使用的,尤其是```vector``` 和 ```pair```。
----
```cpp=
vector<pair<int, int>> ans;
```
----
{"metaMigratedAt":"2023-06-17T06:18:51.463Z","metaMigratedFrom":"YAML","title":"程式設計培訓 - (8)","breaks":true,"slideOptions":"{\"theme\":\"solarized\",\"transition\":\"fade\"}","contributors":"[{\"id\":\"1dfd0d36-665c-414c-a3ba-995f194a8cb9\",\"add\":4021,\"del\":7}]"}