# STL 筆記
### `heap` 自訂排序
```clike=
struct node{
int x, y, num;
};
bool operator < (node l, node r){
return l.num < r.num;
}
priority_queue<node> pq; // 從大到小
priority_queue<int> pq; // 從大到小
priority_queue<int, vector<int>, greater<int>> pq; // 從小到大
```
### `UpperBound() / LowerBound()`
- lower_bound: 找出 `>=num` 的最小值位置
- upper_bound: 找出 `>num` 的最小值位置
```clike=
// Map 的用法
map<int,int> mp = {{0,0}, {1,2}, {2,3}};
auto u = mp.upper_bound(1);
cout<<u->first<<" "<<u->second<<endl; // 2 3
// Set 的用法
set<int> data = {3,7,5,4,2,6};
auto u = data.upper_bound(4);
cout<<*u<<endl; // 5
// Vector 的用法
vector<int> data = {3,7,5,4,2,6};
sort(data.begin(),data.end()); // 必須對 sorted vector 操作
auto u = upper_bound(data.begin(),data.end(),4);
cout<<*u<<endl; // 5
```
### 字串整數轉換
```c++=
string s = to_string(123);
int num = stoi(s);
```
### 幾何
```c++=
double getAngle(int xDiff, int yDiff) {
return atan2(yDiff, xDiff) * 180 / PI;
}
// positive if clockwise
// negative if counter clockwise
int getOrientation(vector<int> &p, vector<int> &q, vector<int> &r) {
int pqx = q[0]-p[0], pqy = q[1]-p[1];
int qrx = r[0]-q[0], qry = r[1]-q[1];
return pqy*qrx - pqx*qry;
}
int getDistance(vector<int> &p, vector<int> &q) {
return (p[0]-q[0])*(p[0]-q[0]) + (p[1]-q[1])*(p[1]-q[1]);
}
```
### Heap / Set / List / Deque 用法
```c++=
// heap
priority_queue<int> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;
while(!maxHeap.empty()){
int data = maxHeap.top(); maxHeap.pop();
}
// set
set<int> s;
multiset<int> s;
s.erase(2);
s.erase(s.begin());
s.erase(s.find(2));
s.erase(prev(s.end()));
// list
list<int> l;
l.push_back(3);
l.push_front(4);
l.pop_back();
l.pop_front();
l.insert(l.begin(), 5);
l.erase(l.begin());
// deque
deque<int> dq;
l.push_back(3);
l.push_front(4);
l.pop_back();
l.pop_front();
```
### 集合中元素是否存在`Count()`
```clike=
set<int> s;
map<int,int> mp;
unordered_set<int> s2;
unordered_map<int,int> mp2;
if(mp.count(1)) // ...
if(mp2.count(1)) // ...
if(s.count(1)) // ...
if(s2.count(1)) // ...
```
### 去除重複
```clike=
sort(ans.begin(),ans.end());
auto it = unique(ans.begin(),ans.end());
ans.erase(it, ans.end());
```