#define RFOREACH(var, arr) for (ARR2IDX(arr) var=(arr).size(); var-->0; )

这个宏的定义:

#define RFOREACH(var, arr) for (ARR2IDX(arr) var = (arr).size(); var-- > 0; )

是用来 反向遍历一个容器(比如 vector) 的,非常紧凑而且聪明的写法。


逐步解释一下:

假设你有一个容器,比如:

std::vector nums = {10, 20, 30, 40};

然后你用:

RFOREACH(i, nums) {
    std::cout << nums[i] << std::endl;
}

这个宏展开成:

for (ARR2IDX(nums) i = nums.size(); i-- > 0; )

分析:

  • ARR2IDX(arr) 这个宏的作用通常是推导合适的索引类型,比如 size_t,常见定义可能是:

    #define ARR2IDX(arr) decltype((arr).size())
    

    这样 ARR2IDX(nums) 会变成 std::vector::size_type(通常是 size_t)。

  • i = nums.size():从最后一个 index 的后面开始。

  • i-- > 0:先判断 i > 0,再执行 i--,所以 最后一次迭代时 i==1,然后变成 0 就退出循环

    所以实际遍历的 index 是:size - 1, ..., 1, 0


所以这个宏就是:

从最后一个元素开始,按 index 倒着遍历整个容器


等价写法(手写版):

for (size_t i = nums.size(); i-- > 0; ) {
    std::cout << nums[i] << std::endl;
}

输出:

40
30
20
10

你可能感兴趣的:(c++)