在 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);
}
最佳答案
自 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/