我创建了一个预处理器宏(@Artyer 大大简化了),它以相对干净的方式为您处理这个问题:
#define for_indexed(...) for_indexed_v(i, __VA_ARGS__)
#define for_indexed_v(v, ...) if (std::size_t v = -1) for (__VA_ARGS__) if ((++v, true))
示例用法:
std::vector<int> v{1, 2, 3};
for_indexed (auto const& item : v) {
if (i > 0) std::cout << ", ";
std::cout << i << ": " << item;
}
要使用不同的循环变量:
for_indexed_v (my_counter, auto const& item : v) ...
额外的控制流逻辑应该在任何非调试版本中被优化掉。剩下的是相对容易阅读的循环语法。
2020 年注意事项:使用基于 lambda 的解决方案而不是宏诡计可能更明智。当然,语法不会那么“干净”,但它的优点是可以被识别为实际的 C++ 语法。这是你的选择。
2017 年 5 月 28 日更新:使break;
语句正常工作
2019 年 1 月 28 日更新:for
输入宏名称,使该词indexed
成为有效的变量名称。我怀疑for_indexed
会引起任何冲突。
2020/12/23 更新:大大简化(感谢@Artyer)