## STL ---- <style> .reveal .slides { text-align: left; } </style> 當我們遇到陣列沒辦法解決的超複雜實作題時... ---- ### queue (佇列) ---- queue就像是放東西進水管一樣,**先進先出**。 (First In First Out) -> FIFO ---- 常見操作有 : * push : 把一個元素(element)加入到 queue 的尾巴。 * pop : 把頂端(第一個)元素移除。 * back : 得到尾巴的值。 * front : 得到頂端的值。 ---- ![](https://i.imgur.com/QTEd3zK.png) ---- ```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 頂端給拿走。 ---- ![](https://i.imgur.com/d4FvsGv.png) ---- ```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 可以當成陣列來操作。 ---- ![](https://i.imgur.com/D8zYNGR.png) ---- ```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 (集合) ---- 如何判斷一個陣列中有沒有某個數? 如何判斷兩個陣列中有幾個相同的數? 如何快速的把一個元素從陣列中拿掉? ---- ![](https://i.imgur.com/M4K3CLx.png) ---- 常見的操作有 :  * 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 (表) ---- 一個東西對到一個東西,例如 : * 你的座號對到你的姓名 * 你的名字對到你的存款 * ... ---- ![](https://i.imgur.com/l49Rayn.png) ---- 常見的操作 : * 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}]"}
    198 views
   Owned this note