代码教训总结

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> 引入头文件,prevnext 这两个名字都会引起变量名冲突,可以用 prvnxt 代替。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值