想像一下…
你聽老師的話,開始讀高手的程式碼——也許是比賽的官方解答,也許是排行榜第一名的提交。滿懷期待點開,看到的是這樣的東西:
#include <bits/stdc++.h>
using namespace std;
#define SZ(x) (int)((x).size())
using pii = pair<int, int>;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<pii> v(n);
for (auto &[a, b] : v) cin >> a >> b;
sort(v.begin(), v.end());
for (auto [a, b] : v) cout << a << ' ' << b << '\n';
return 0;
}
明明每個字母都認識,合起來卻像另一種語言:bits/stdc++.h 是哪來的標頭檔?#define 和 using pii 在幹嘛?auto 是什麼型態?[a, b] 這對中括號又是怎麼回事?開頭那兩行 sync 跟 tie 更是完全沒見過。
其實這份程式做的事你全部都會:讀入 n 對數字、排序、輸出——第十、十一單元的老朋友。看不懂的部分沒有半點新演算法,全是語法糖與工程知識:同一件事的更省力寫法、讓程式跑快一點的開關、少打幾個字的縮寫。高手用它們,是因為比賽時每一秒都珍貴。
本單元就是這份程式的解碼手冊。十個小節,每一節都是「你已經會的事,有更省力的寫法」——12.1 拆萬用標頭檔、12.2 拆 auto、12.5 拆 [a, b]、12.10 拆那兩行加速開關。學完之後回頭看這份程式,每一行你都讀得懂;更重要的是,你可以挑幾個真正值得用的收進自己的工具箱——不必全用,但至少不再被它們擋在別人的程式碼外面。