代码教训总结
2018/5/19
用整數表示集合時,判斷第 i 個元素是否屬于集合 S,可以用 if (S & 1 << i) 或 if (S >> i & 1) 。判斷第 i 個元素是否不屬于集合 S 時,我一般會用 if ( (S & 1 << i) == 0 ),但是這樣寫有一個壞處:常常會忘記 bitwise and(&)算符的優先級低于 == 算符。有兩個更好的寫法可以避免這個問題,第一個是 if ( !(S & 1 << i) ),因為我知道 ! 算符的優先級是很高的;第二個是 if ( ~S & 1 << i ) 這個寫法不需要括號,可以說是很優雅了 XD,但是由于要多算 ~S, 是否會比較慢?(玄學) 。
Remark:&、^、|、&&、|| 都比 == 優先級低。
2018/4/21
WA 了首先要檢查輸入數據的類型是否跟數據范圍匹配。
2018/4/18
在某個問題中,需要實現以下過程。
維護一個二元組(std::pair<int,int>)的集合。
pair 的第二維表示 unique 且 const 的 ID,第一維只減不增,并且始終大于等于 $0$ 。
每次從集合中取出第一維為 $0$ 的 pair(并將其從集合中刪除,保證這樣的 pair 存在),然后將集合中的某些 pair 的第一維減 $1$ 。
我的寫法:
- 用 std::set<std::pair<int,int>> 支持取出第一維是 $0$ 的 pair
- 用一個數組存儲每個 ID 對應的 std::pair<int,int>::first 的當前值。
- 若 set 中第一個元素的第一維與數組中的值不相等,則更新
這種做法是有問題的,因為并不能確任當前 set 中的第一個元素的第一維的實際值就是 $0$ 。
正確的做法是即時更新 set 中的元素(先 erase 舊的,再 insert 新的),而且上述數組也是不必要的。
2018/1/1
對 $m$ 取模的運算,一定保證最后結果在 $0$ 到 $m-1$ 之間。
DP:要考慮是否有某些狀態雖然是個合法狀態,但是始終沒被計算到。
2018/1/2
變量命名:若用 #include <bits/stdc++.h> 引入頭文件,prev,next 這兩個名字都會引起變量名沖突,可以用 prv 和 nxt 代替。
2018/1/3
不要濫用 for 循環,用 while 循環合適時應當用 while 。
2018/4/2
“把簡單的問題搞復雜”、“很短的代碼就能解決,我的代碼卻很長”;這類錯誤是不能容忍的。
2018/4/3
用 range-for 遍歷容器 a 時,若要修改容器中的元素則應該用 for(auto &x: a) 。不修改時,也可以這么用,所以用 range-for 時,總是采用引用的形式。
轉載于:https://www.cnblogs.com/Patt/p/8167365.html
總結
- 上一篇: 行车记录仪接降压线对电瓶有影响吗
- 下一篇: log4j2常见配置