2024/03/20 → 2024/04/03
講者:YuDong
所以 iterator 迭代器只會稍稍提及一下!
//array 陣列
int ary[10];
int 2d_ary[10][10];
//string 字串
string s;container<type> name;
//以往我們宣告陣列
int ary[45];
//declare
vector<int> v;
set<double> st;可以動態調整長度的陣列
#include<vector>
//標頭檔
//basic declare
vector<int> v;varName(size);
vector<int> vec(3);
// [0, 0, 0]varName(size,value);
vector<int> vec(4,2);
// [2, 2, 2, 2]varName = {a, b, c}
vector<int> team = {1, 3, 5};
//[1, 3, 5]Methods:
Description
時間複雜度
.push_back(val).size().emplace_back(val).resize(n)
.clear().begin().end()取得陣列大小
在最後方插入val在最後方插入val調整陣列長度為n清空該陣列陣列裡第一個資料的位置陣列裡最後一個資料位置的後一位位置O(1)O(1)O(1)O(|size-n|)O(size)O(1)O(1).front()陣列最前面的元素.front()陣列最後面的元素O(1)O(1)用一張圖來解釋 vector 的話:
//法一:
for(int i = 0; i < n; ++i) {
cout << v[i] << " ";
}
//法二:
for(auto x: v) {
cout << x << " ";
}vector 的遍歷
法二的部分,日後有機會再詳談
可以先記他的用法 :D
vector<int> v;
vector<int> example(3); //分配好空間大小
for(int i = 0; i < 3; ++i) {
cin >> example[i];
//分配好空間的 vector 可以像一般陣列一樣輸入
}
for(int i = 0; i < 5; ++i) {
v.push_back(i);
//v: [0,1,2,3,4]
}
for(int i = 0; i < 5; ++i) {
cout << v[i] << " "; //0 1 2 3 4
}
cout << v[2] << "\n"; //2
寫起來的話長這樣子:
將兩個元素型別包起來!
資料型別:
如 int, char, double等
//標頭檔
#include<utility>
pair<int, int> ppl;
//pair<type1, type2> name;
pair<int, int> xd = {210, 211};
pair<int, int> xp(29,28);
xd.first; //210
xp.second; //28
pair<pair<int, char>, int> super = {{2,a},9};
super.first; //{2, a}
super.first.first; // 2
super.second; //9vector<pair<int, int> > vpp;
vpp.push_back(make_pair(2,3));
vpp.push_back({4,3});
vpp.emplace_back(4,3);
這裡以剛剛教過的 vector 舉例:
a915 解題提示:
輸入到 pair 中
然後用 sort() 方法排序
vector<pair<int ,int> > v;
for(int i = 0; i < n; ++i) {
int x,y; cin >> x >> y;
v.emplace_back(x,y);
//or v.push_back({x,y}); 也可以
}
sort(v.begin(), v.end());大致上長這樣 忘記 sort() 怎麼用的可以找一下之前的講義
stack 有一個特性:LIFO
stack 有一個特性:LIFO
可以把它想像成一疊盤子、書之類的
#include <stack>
stack<int> st;
//stack<type> name;常用方法
.size() .push(val) .pop() .top() .empty()
說明
取得stack的長度 新增 val 到頂端 移除最頂端元素 查看最頂端元素
確認是否為空k612 解題提示:
stack 只放 '(' 跟 '['
然後去比對字串中,第 i 個字元是什麼for(int i = 0; i < s.size(); i++) {
if(s[i] == '(' || s[i] == '[' || st.empty()) st.emplace(s[i]);
else if(!st.empty()) {
if( (st.top() == '(' && s[i] == ')') || (st.top() == '[' && s[i] == ']') )
st.pop();
else break;
}
}k612 題解提示:
有些人說隊列
queue 有一個特性:FIFO
有些人說隊列
queue 有一個特性:FIFO
先進先出
可以把它想像成排隊的人群隊伍
#include <queue>
queue<int> qq;
//queue<type> name;常用方法(與stack 相似)
.size() .push(val) .pop() .front() .back() .empty()
說明
取得queue的長度
新增 val 到尾端
移除最前端元素
查看最前端元素
查看最尾端元素
確認是否為空參照上一頁的幾個 Methods 就可以做出來了!
前面介紹的都是線性資料結構 其操作的複雜度通常都是 O(1) 或者 O(n)
前面介紹的都是線性資料結構 其操作的複雜度通常都是 O(1) 或者 O(n) 接下來要介紹一些非線性資料結構 課程因時間因素還有難度上的調整 只會先介紹 set 跟 map 實際上還有許多非線性資料結構,如: priority_queue, multiset, unordered_map
不會有重複的元素
支援快速 搜尋、修改(插入、移除)
平衡二元樹的紅黑樹
insert(val)
erase(val)
count(val)
插入 val 到 set 當中 將元素刪除 尋找 val 在 set 中出現的數量 (實際回傳只會有 1 or 0) 尋找 val 的位置 找第一個大於等於 val 的值的位置 找第一個大於 val 的值的位置
set<int> st;
for(int i = 0; i < 5; ++i) {
st.insert(i);
}
for(auto it = st.begin(); it != st.end(); it++) {
cout << *it << " ";
}//0 1 2 3 4
for(auto x : st) {
cout << x << " ";
}//0 1 2 3 4set 裸題
運用前面提到的 Method 即可解出
set<int> st;
while(n--) {
int x;cin >> x;
st.insert(x);
}
cout << st.size() <<endl;
for(auto it:st) cout << it << " ";
cout << endl;沒有重複的 key-value pair
搜尋 , 插入 , 移除 元素
insert(val)
erase(val)
find(val)
lower_bound(val)
upper_bound(val)
插入 val 到 set 當中
將元素刪除
尋找 val 的位置
找第一個大於等於 val 的值的位置
找第一個大於 val 的值的位置
#include <map>
map<int ,string> mp;
//map<type1, type2> name;
mp[3] = "test";
map<string, int> ms;
ms["Wang"] = 35;
可以把 map 理解成是一把鑰匙對應一道門
key
value
可以把 map 理解成是一把鑰匙對應一道門
key
value
例如:
座號 27 號 - 小明
key
value
可以把 map 理解成是一把鑰匙對應一道門
key
value
例如:
座號 27 號 - 小明
正常情況來說,一個班級只會有一個 27 號
正好與 map 的概念有點像
key
value
礙於時間因素沒辦法完整介紹
回家自己練習的時候也可以私訊我 Discord 或其他聯繫管道!