C++ 反向遍历 array 小记

发布时间 2023-12-19 11:18:48作者: BuckyI

有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些 bug 记录在这里。

首先 arr.size() 的数据类型为 size_t,为无符号整型

对于 for (int idx = arr.size() - 1; idx >= 0; idx--):

  • 使用 int 作为 idx 的类型,有一定概率会编译失败,因为 size_t 的具体类型随实现而不同,可能和 int 无法兼容,所以建议直接使用 std::size_tauto
  • 另一个比较致命的问题,size_t 为无符号整型,这意味着, idx >= 0 会永远满足,当 idx-- 突破 0 时,会回到极大数字……

因此可以考虑 for (long idx = arr.size() - 1; idx >= 0; idx--),从无符号数变为有符号数,就可以正常执行循环并跳出了。
但是,这个方法同样存在 longsize_t 可能存在不匹配的情况(虽然风险比较小,但确实存在,原因大概是,从无符号数到有符号数的转变,是 implementation-defined behavior[1]

最优雅的方法应该是:

for (auto idx = arr.size() - 1; idx < bin.length(); --idx)
{
    // some code
}

虽然跳出循环的判别标准是 idx < bin.length(),与正向遍历的标准一致,但是 it works!原因上面提到了。


  1. https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior#4105123 ↩︎