本單元常犯錯誤總覽
| # | 錯誤描述 | 錯誤類型 | ✗ 錯誤寫法 | ✓ 正確寫法 |
|---|---|---|---|---|
| 1 | v[i] 索引越界 |
UB | vector<int> v(3); v[3] = 1; |
檢查範圍;除錯時換 v.at(i) |
| 2 | 空 vector 呼叫 pop_back/back/front |
UB | 沒檢查就 v.pop_back(); |
先 if (!v.empty()) |
| 3 | 空 vector 遇上 size() - 1 |
RE/邏輯錯誤 | for (int i = 0; i <= v.size() - 1; i++) |
int n = (int)v.size(); 再用 n |
| 4 | 把 reserve 當 resize 用 |
UB/邏輯錯誤 | v.reserve(n); v[0] = 1; |
v.resize(n);(reserve 別用) |
| 5 | 迴圈裡大量 insert/erase 在前段 |
TLE | 每圈 v.insert(v.begin(), x) |
改成尾端操作或換做法 |
| 6 | 兩個字面常數相加 | 編譯錯誤 | string s = "AACP" + "SCHOOL"; |
string s = "AACP"; s += "SCHOOL"; |
| 7 | 比較式兩側都不是 string | 邏輯錯誤 | if ("AB" < "A") |
至少一側是 string 變數 |
| 8 | find 回傳值直接當條件 |
邏輯錯誤 | if (s.find(t)) |
if (s.find(t) != string::npos) |
| 9 | 迴圈裡 ans = ans + s |
TLE | ans = ans + s; |
ans += s; |
| 10 | stoi 餵超過 int 範圍的數 |
RE | stoi("9876543210") |
用 stoll;更大就整串當字串處理 |
| 11 | cin >> 之後接 getline |
邏輯錯誤 | 讀完 n 直接 getline |
中間補 cin.ignore(); |
| 12 | 重複使用 stringstream 沒重置 | 邏輯錯誤 | 讀完直接再 ss << ... |
先 ss.str(""); ss.clear();(或每次開新的) |