c++ - 在现代 C++ 中,是否有等效于来自 python 的基于范围的 `enumerate` 循环?

标签 c++ c++14 c++20 enumerate

在 C++ 中是否有与 python 中基于范围的 enumerate 循环等效的东西? 我会想象这样的事情。

enumerateLoop (auto counter, auto el, container) {
    charges.at(counter) = el[0];
    aa.at(counter) = el[1];
}

这可以用模板或宏来完成吗?

我知道我可以只使用老派的 for 循环并迭代直到到达 container.size()。但我感兴趣的是如何使用模板或宏来解决这个问题。

编辑

根据评论中的提示,我玩了一下 boost 迭代器。我得到了另一个使用 C++14 的可行解决方案。

template <typename... T>
auto zip(const T &... containers) -> boost::iterator_range<boost::zip_iterator<
decltype(boost::make_tuple(std::begin(containers)...))>> {
  auto zip_begin =
    boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
  auto zip_end =
    boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
  return boost::make_iterator_range(zip_begin, zip_end);
}

template <typename T>
auto enumerate(const T &container) {
return zip(boost::counting_range(0, static_cast<int>(container.size())),
container);
} 

https://gist.github.com/kain88-de/fef962dc1c15437457a8

最佳答案

自 C 语言以来,枚举多个变量一直是一个惯用语。唯一的麻烦是您不能在 for 循环的初始化程序中声明两个变量。

int index;
for (auto p = container.begin(), index = 0; p != container.end(); ++p, ++index)

我认为没有比这更简单(或更强大)的了。

关于c++ - 在现代 C++ 中,是否有等效于来自 python 的基于范围的 `enumerate` 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769156/

相关文章:

c++ - 如何从两个迭代器创建范围

c++ - 如何在已分配的内存上调用构造函数?

c++ - 是否可以简单地复制::std::tuple-like 类模板?是否存在实现?

C++:使用 C++14 通用 lambda boost fusion fold

c++ - C++14 中通用 lambda 函数的递归

c++ - 可以在 Debian Bullseye 上使用 g++ (gcc) 11 吗?

c++ - 用于在 C++ 中访问数组的代码混淆

c++ - C++1y 模式下的 Clang >= 3.3 无法解析 <cstdio> header

c++ - GCC 拒绝使用 enum-base 的简单声明; clang 接受它——这是正确的吗?

在 gcc 9.3 中编译但不能在 gcc 10.2 中编译的 C++ 代码