# 進階STL: # priorty_queue set pair ### 2021/12/03 電算社第十堂社課 --- ### 萬能標頭檔 ---- ```cpp= #include <bits/stdc++.h> // C++ #include <algorithm> #include <bitset> #include <complex> #include <deque> #include <exception> #include <fstream> #include <functional> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> // and more ``` ---- * 引入大部分的常用標頭檔 * 部分比賽和 Online Judge 不支援這個標頭檔,測機務必先測試可否使用 * 占用較大的記憶體空間,限制較緊時應避免使用此標頭檔 --- ### 存取概念 ---- 循序存取 (Sequential Access) V.S. 隨機存取 (Random Access) ![](https://i.imgur.com/MzqvbQa.png =50%x) ---- * 此隨機非彼隨機 * 在一條東西上移動時,花費的時間不隨距離增長 * 瞬間移動 * Youtube vs. CD player * 可隨機存取:陣列、vector、deque * 不可隨機存取:set、map、stack、priority_queue --- ## priority_queue ---- 會依照大小順序排列的queue(由大排到小) ---- 標頭檔 ```cpp= #include<queue> ``` ---- 宣告 ```cpp= priority_queue<type> pq; ``` ---- 功能 * pq.push() * pq.pop() * pq.top() * pq.empty() * pq.size() ---- ```cpp= #include <iostream> #include <queue> using namespace std; int main(){ priority_queue<int> pq; pq.push(2); //前[2]後 pq.push(1); //前[2, 1]後 pq.push(3); //前[3, 2, 1]後 pq.pop(); //前[2, 1]後 cout << pq.top(); // 2 cout << pq.empty(); // 0 cout << pq.size(); // 2 } ``` ---- #### greater(由小到大) ```cpp= priority_queue<int , vector<int> , greater<int> > pq; pq.push(6); pq.push(4); cout << pq.top(); ``` --- ## set ---- 數學上的 set: 一堆東西,不重複、沒有順序 ![](https://i.imgur.com/zftJtFJ.png =40%x) C++ 裡的 set:會自己排序好 ---- 標頭檔 ```cpp= #include<set> ``` ---- ```cpp= #include<iostream> #include<set> using namespace std; int main(){ set<int> s; s.insert(4); // s = {4} s.insert(5); // s = {4, 5} s.insert(3); // s = {3, 4, 5} s.erase(4); // s = {3, 5} cout << s.size() << '\n'; // -> 2 cout << s.empty() << '\n'; // -> 0 (false) // 檢查set裡面有沒有某個值 cout << s.count(4) << '\n'; // -> 0 cout << s.count(3) << '\n'; // -> 1 s.clear(); // s = {} cout << s.empty() << '\n'; // -> 1 (true) } ``` ---- * s.empty() * s.size() * s.clear() * s.insert(a) * s.erase(a) ---- * s.begin() * s.end() * s.count(a) * s.lower_bound(a) * s.upper_bound(a) --- ## pair ---- 類似數對,但裡面可以存不是數字的東西 可以搭配其他STL使用(如vector) ---- 標頭檔 ```cpp= #include <tuple> ``` ---- 宣告 ```cpp= pair<type1 , type2> p; ``` ---- 初始化 ```cpp= pair<int, int> p = make_pair(8, 7); // p = (8, 7) ``` ```cpp= pair<int, int> p = {8, 7}; // p = (8, 7) ``` ---- 功能 `p.first` `p.second` ---- ```cpp= #include <iostream> #include <tuple> using namespace std; int main(){ pair<int, int> p = {1, 2}; cout << p.first << ' ' << p.second; // 1 2 } ``` ---- 多層pair ---- ```cpp= pair<type1, pair<type2, type3> > p; ``` ---- ```cpp= #include <iostream> #include <tuple> using namespace std; int main(){ pair<int, pair<int, int> > p = {1, {2, 3}}; /* p.first = 1 p.second.frist = 2 p.second.second = 3 */ cout << p.first << ' ' << p.second.first << ' ' << p.second.second; // 1 2 3 } ``` --- ### pair x vector x algorithm ---- ```cpp= vector< pair<int, int> > vp; ``` ---- ```cpp= #include<bits/stdc++.h> using namespace std; vector< pair<int,int> > v(5); int main() { v[0].first = 1; v[0].second = 2; v[1] = make_pair(1,5); v[2] = make_pair(3,4); v[3] = make_pair(3,6); v[4] = make_pair(5,4); sort(v.begin() , v.end()); for(int i=0 ; i<5 ; i++) { cout << v[i].first << " " << v[i].second << "\n"; } } ``` --- ### OJ練習 考完期中考了:D 在考完當天,1892班只出了數學一科的成績, 好勝的同學們想要排出誰的分數高,誰的分數低! 因次,他們決定使用c++ sort的方式進行。 他們想要製作出一張表,裡面記錄這20位同學,的座號和分數, 並且按照**成績由小到大**排序。 ---- 輸入說明:20位同學的座號(左)以及數學成績(右) 輸出說明:排列完的座號以及成績 ``` 1 45 2 54 3 54 4 23 5 86 6 24 7 77 8 96 9 56 10 76 11 86 12 45 13 87 14 45 15 87 16 8 17 57 18 98 19 100 20 34 ``` ---- 我是防雷頁:D ---- ```cpp= #include<bits/stdc++.h> using namespace std; vector< pair<int,int> > v(1e5); // 10^5 int main() { for(int i=0 ; i<20 ; i++) cin >> v[i].second >> v[i].first; sort(v.begin() , v.begin()+20); for(int i=0 ; i<20 ; i++) cout << v[i].second << " " << v[i].first << "\n"; } ``` ----
{"metaMigratedAt":"2023-06-16T15:38:23.451Z","metaMigratedFrom":"YAML","title":"進階STL:priorty_queue set pair","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"theme\":null}","contributors":"[{\"id\":\"9e7d687a-83f2-4e8a-8ee6-8846394e69a5\",\"add\":1717,\"del\":1111},{\"id\":\"efc43b79-1b19-4cb1-9b18-ce50fad56214\",\"add\":1842,\"del\":1720},{\"id\":\"68c94489-3c2e-4879-b847-e982f360b03c\",\"add\":1971,\"del\":150},{\"id\":\"4f731eff-9d88-41f4-af56-2e3e02f20cfc\",\"add\":1731,\"del\":48}]"}
    344 views
   Owned this note