这个宏的定义:
#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_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