C++ 反向遍历 array 小记
有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些 bug 记录在这里。
首先 arr.size() 的数据类型为 size_t,为无符号整型
对于 for (int idx = arr.size() - 1; idx >= 0; idx--):
- 使用
int作为idx的类型,有一定概率会编译失败,因为size_t的具体类型随实现而不同,可能和int无法兼容,所以建议直接使用std::size_t或auto - 另一个比较致命的问题,
size_t为无符号整型,这意味着,idx >= 0会永远满足,当idx--突破 0 时,会回到极大数字……
因此可以考虑 for (long idx = arr.size() - 1; idx >= 0; idx--),从无符号数变为有符号数,就可以正常执行循环并跳出了。
但是,这个方法同样存在 long 和 size_t 可能存在不匹配的情况(虽然风险比较小,但确实存在,原因大概是,从无符号数到有符号数的转变,是 implementation-defined behavior[1] )
最优雅的方法应该是:
for (auto idx = arr.size() - 1; idx < bin.length(); --idx)
{
// some code
}
虽然跳出循环的判别标准是 idx < bin.length(),与正向遍历的标准一致,但是 it works!原因上面提到了。

浙公网安备 33010602011771号