Petingo
Taiwan
講義 & 題目:petingo.me/cp/
要幹嘛
上次的題解
基礎資料結構
Array & Linked List
Array & Linked List
queue
stack
Graph
Graph
如何表示一張圖?
Adjacency Matrix
如何表示一張圖?
Adjacency List
tree
tree
template<class T>
struct Node<T>
{
T value;
struct Node<T>* parent;
vector<struct Node<T>*> children;
};
tree
DFS、BFS
C++ STL
string
string
#include <string>
using namespace std;
int main(){
string s = "meow";
s[2]; // o
s.length(); // 4
s.size(); // 4
s = s + s; // meowmeow
s < "woof"; //true
cin >> s;
cout << s;
}
vector
vector
vector
#include <vector>
using namespace std;
int main(){
vector<int> v; // empty
v.push_back(3); // 3
v.push_back(4); // 3, 4
v.push_back(5); // 3, 4, 5
v[0] = v[1] - v[0]; // 1, 4, 5 (v[0] = 4 - 3)
v.size() // size = 3
v.pop_back(); // 1, 4
v.size(); // size = 2
v.clear(); // 清空!
v.empty(); // true
}
deque
deque
list
insert(iterator, object)
erase(iterator)
erase(first, last)
iterator
iterator
iterator
// vector 基本用法範例
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v; // 宣告 v
v.push_back(10); // v = {10}
v.push_back(20); // v = {10, 20}
v.push_back(30); // v = {10, 20, 30}
vector<int>::iterator iter; // 宣告 iterator
// v.begin() 指向 v[0] iterator
// v.end() 指向 v[size()] ** 注意 v[size()] 其實是沒東西的!
// iter++ 讓 iterator 指向下一個元素
for (iter = v.begin(); iter != v.end(); iter++) {
// iter 類似指標,所以如果要取直要加 *
cout << *iter << endl;
}
cout << v.end() - v.begin() << endl; // 輸出 3
}
foreach + auto
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
for (auto i : v) {
cout << i << endl; // 這邊不用加 *
}
}
stack
stack<T, C>
C 為要使用的容器,可為 vector、list 或 deque
stack<int> s;
stack<int, vector<int>> s;
stack
queue
priority_queue
priority_queue
priority_queue
priority_queue<T, C, cmp> pq
T 型態
C 容器
cmp 比較方法
priority_queue<int, vector<int>, grater<int>> pq
priority_queue
#include <bits/stdc++.h>
using namespace std;
// 1 3 2 9 9 8 1
int main() {
priority_queue<int, vector<int>, greater<int>> pq;
pq.push(1);
pq.push(3);
pq.push(2);
pq.push(9);
pq.push(9);
pq.push(8);
pq.push(1);
while (!pq.empty()) {
cout << pq.top() << " ";
pq.pop();
}
}
priority_queue
重寫 cmp()
或是重載 operator<
重載 < const 要加好,不然會噴錯
// work
bool operator<(const MyClass &other) const {
return key < other.key;
}
// not work
bool operator<(MyClass &other) const {
return key < other.key;
}
// not work
bool operator<(const MyClass &other){
return key < other.key;
}
priority_queue
// 一坨貓貓,用年齡越大的優先序越高
#include <bits/stdc++.h>
using namespace std;
class Meow {
public:
string name;
int age;
Meow() {}
Meow(string n, int a) { name = n, age = a; }
bool operator<(const Meow &other) const { return age < other.age; }
};
int main() {
priority_queue<Meow> pq;
pq.push(Meow("Amy", 999));
pq.push(Meow("Bob", 3));
pq.push(Meow("Cathy", 777));
pq.push(Meow("Dick", -1));
while (!pq.empty()) {
cout << pq.top().name << " : " << pq.top().age << endl;
pq.pop();
}
}
pair
pair
pair<Ta, Tb> p
p.first
p.second
// 創造一個 (3, 4) 的 pair,然後印出第一個、第二個
// 輸出結果:3 4
pair<int, int> a(3, 4);
cout << a.first << endl;
cout << a.second << endl;
pair
make_pair(a, b);
自動生成對應形別的 pair
make_pair(5, 3) // pair<int, int>
make_pair("meow", 3) // pair<string, int>
pair
pair<int, int> a, b;
a < b?
先比 first、再比 second
map
map
map<Key, Value> m;
m[Key] = Value;
m.insert(pair<Key, Value>)
m.erase(Key)
m[Key]
m.find(Key)
map
#include <bits/stdc++.h>
using namespace std;
int main() {
map<string, int> score;
score["B10532026"] = 100;
score["B10538888"] = 60;
score["B10599123"] = 88;
cout << score["B10532026"] << endl;
cout << (*score.find("B10532026")).second << endl;
}
map
找東西是否存在有兩種方法
if(m[key] != 0) // bad
m[key]會在沒有key自動生出新的元素
導致map內的元素個數增加
if(m.find(key) != m.end()) // good
m.find並不會增加map內的元素個數
set
set
set<T> s;
s.insert(T object)
s.erase(T object)
s.erase(iterator)
set
// 範例:把 1 1 4 4 3 1 5 4 4 3 這個序列塞進 set
// 然後把 3 刪掉
// 輸出結果為 1 4 5
#include <bits/stdc++.h>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(1);
s.insert(4);
s.insert(4);
s.insert(3);
s.insert(1);
s.insert(5);
s.insert(4);
s.insert(4);
s.insert(3);
s.erase(3);
for (auto i : s) {
cout << i << endl;
}
}
unordered map/set
By Petingo