本單元重點回顧
bits/stdc++.h是 GNU 專屬萬用包:全部標頭檔一行搞定;代價是不可移植、編譯變慢、撞名機率增加(ambiguous 錯誤就換變數名)。比賽環境幾乎都是 GNU,放心用。auto讓編譯器從初始值推型態:沒有初始值不能用;推的是「初始值的型態」(1e18是 double)。建議只用在型態名稱又臭又長處——iterator、結構化綁定、lambda。參考=別名:
int &r = a;之後r與a是同一個變數;宣告必綁定、綁定不能換。7.5 的參數&就是它。大容器進函式要加
&:傳值是整份複製 O(n);不改就const vector<int> &v,要改就去掉 const。range-based for:
for (int x : v)掃過全部元素;要寫入就加&,忘了就是「悄悄不動」的複本 bug。拿不到索引、只能從頭走到尾。結構化綁定拆 pair:
auto [a, b] = p;;配 range-based for 掃vector<pair>是招牌組合技,複本/別名規則跟 range-based for 同一套。條件運算子
a ? b : c:兩個值選一個,一行搞定;它是運算式,分支只能是值。逗號運算子A, B結果是 B——for 第三格以外能免則免。using ll = long long;取型態別名:綽號與本名同一個型態;ll、pii是全圈公認縮寫,別名別取過頭。(延伸)lambda 把函式寫在使用處:
[](int x, int y) { return x > y; }直接塞 sort;[&]抓外面變數,比較依據不用開全域。(延伸)巨集是編譯前的文本取代:不是函式、不動腦;括號包好包滿(
SQ(1 + 2)的教訓)。初學上限是SZ這種一行小工具,縮寫需求交給using。加速開場白兩行+
'\n':斷開同步、斷開綁定,cin/cout 不輸 scanf;endl每行強迫清緩衝區,大量輸出慢五十倍。關同步後兩套輸入輸出不可混用。