# C++ STL --- # 前言 ---- # 資料結構 ---- ## 資料結構簡介 https://hackmd.io/GnFwiUwjQCmnxYsYL3DtNg#/10 --- # STL是什麼? ---- ## Standard Template Library #### (標準樣板函式庫) ---- #### STL 包含一組通用的模板類和函數,可以省下手刻的麻煩 --- # Vector(向量) ---- vector 是一種動態的陣列,提供了快速的插入和刪除操作(就像python的list) ![](https://hackmd.io/_uploads/By3qAwCfT.png) 圖片來源:Colin用Google試算表畫的 ---- | 常用成員函式 | 功用| | ------ | -------- | |push_back()|將元素複製到vector後端| | emplace_back() | 將元素建構到vector後端 | | size() | 回傳vector有幾個元素 | | operator[x] | 取得第x個元素的值 | |clear() | 清空vector| ---- ### 範例 ```cpp= #include <vector> using namespace std; int main(){ vector<int> vec; vec.push_back(1); cout<<vec[0]; } ``` --- # Stack(堆疊) ---- stack 是一種後進先出(Last-In-First-Out, LIFO)的線性資料結構,每次取出的資料是最晚放進去的資料。 ![](https://hackmd.io/_uploads/HJdfbFRzp.png) 圖片來源:Programiz ---- | 常用成員函式 | 功用| | ------ | -------- | |push()|將元素放入stack頂端| | pop() | 從stack頂端移出一個元素 | | top() | 取得stack頂端的元素 | | size() | 回傳stack有幾個元素| |empty()|判斷stack是否為空| ---- ### 範例 ```cpp= #include <iostream> #include <stack> using namespace std; int main() { stack<int> s; s.push(1); // 1 s.push(2); // 1 2 s.push(3); // 1 2 3 cout << s.top()<<endl; // 3 s.pop(); // 1 2 cout << s.top(); // 2 } ``` ---- # 練習 ## CSDC31 ---- ```cpp= #include<iostream> #include<stack> using namespace std; int main(){ string str; stack <int> s; int n; while(cin>>str){ if(str=="push"){ //push cin>>n; s.push(n); }else if(str=="pop"){ //pop cout<<S.top()<<endl; s.pop(); } } } ``` ---- # 應用 DFS、括號匹配、後序式運算 --- # Queue(佇列) ---- queue 是一種先進先出(First-In-First-Out, FIFO)的線性資料結構,每次取出的資料是最晚放進去的資料。 ![](https://hackmd.io/_uploads/rkyF7F0Gp.png) 圖片來源:Programiz ---- | 常用成員函式 | 功用| | ------ | -------- | |push()|將元素放入queue前端| | pop() | 從queue後端移出一個元素 | | front() | 取得queue前端的元素 | |back()|取得queue後端的元素| | size() | 回傳queue有幾個元素| |empty()|判斷queue是否為空| ---- ### 範例 ```cpp= #include <iostream> #include <queue> using namespace std; int main() { queue<int> q; q.push(1); // 1 q.push(2); // 1 2 q.push(3); // 1 2 3 cout << q.front()<<endl; //1 q.pop(); // 2 3 cout << q.front(); // 2 } ``` ---- # 應用 BFS --- # set(集合) ---- set 是一個關聯式容器,set 容器裡面的元素是唯一的,具有不重複的特性,而且是有排序的容器,set 容器裡面元素的值是不可修改,但 set 容器可以插入或刪除元素。 ---- | 常用成員函式 | 功用| | ------ | -------- | |insert()|將元素插入到set| | erase() | 將指定元素從set刪除 | | count() | 判斷指定元素是否存在set中 | |find()|判斷指定元素是否存在set中| |size() | 回傳set有幾個元素| ---- ### 範例 ```cpp= #include <iostream> #include <set> #include <iterator> using namespace std; int main() { set<int> S = {5, 4, 3, 2, 1}; // 1 for (set<int>::iterator it = S.begin(); it != S.end(); ++it) { cout << *it << ' '; } cout << '\n'; S.insert(6); //插入6 S.erase(3); //插入3 // 2 for (auto it = S.begin(); it != S.end(); ++it) { cout << *it << ' '; } cout << '\n'; // 3 for (auto it : S) { cout << it << ' '; } cout << '\n'; return 0; } ``` ---- # 練習 ## CSDC163 ---- ```cpp= #include<iostream> #include<set> using namespace std; int main(){ set<int>s; int n; cin>>n; for(int i=0;i<n;i++){ int x; cin>>x; s.insert(x); } cout<<s.size(); //set大小 = 不重複的數量 } ``` --- # Map(集合 key-value) ---- map 是一個關聯式容器,用於存儲鍵-值對。map 提供了一種有效的方式來將鍵映射到相應的值,並且根據鍵的排序方式保持它們的有序性。 ---- | 物件 | | | ------ | -------- | |first|map的第一個變數(key)| | second | map的第二個變數(value) | ---- | 常用成員函式 | 功用| | ------ | -------- | |operator[x]|取得key為x的value| | insert() | 將pair<key,value>插入map | | erase() | 將指定元素從map刪除 | | find() | 判斷指定元素的key值是否存在map中 | |count() | 判斷指定元素的key值是否存在map中| |size()|回傳map有幾個元素| ---- ### 範例 ```cpp= #include <iostream> #include <map> using namespace std; int main(){ map<int, string> m; m[1] = "colin"; //插入{1,"colin"} m[2] = "yen"; //插入{2,"yen"} m.erase(1) for(auto i:m){ cout << i.first << ' ' << i.second << endl; } } ``` --- # Priority Queue(堆積) ---- priority_queue,實現了一個優先級隊列的數據結構。優先級隊列是一種特殊的容器,其中的元素按照一定的優先級進行排序,並且在操作時,具有最高優先級的元素會最先被取出。 ---- | 常用成員函式 | 功用| | ------ | -------- | |push()|將元素放入priority_queue| | pop() | 將priority_queue中優先級最高的元素刪除 | | top() | 取得priority_queue中優先級最高的元素 | | empty() | 判斷priority_queue是否為空 | |size() | 回傳priority_queue中有幾個元素| ---- ### 範例 ```cpp= #include <queue> ``` ---
{"title":"STL","lang":"zh-TW","description":"20231101進階組簡報","contributors":"[{\"id\":\"fd160699-cd06-45fd-abd0-c09edbc85980\",\"add\":1024,\"del\":55},{\"id\":\"8b61a27e-159d-4386-a2e4-e9ff3c2e6c6e\",\"add\":5569,\"del\":1830}]"}
    248 views