具有自定义步骤的循环的C 范围
C++ range for loops with custom step
在C 11中,您可以在具有循环范围的容器上迭代:
for (auto i : vec) { /* do stuff */ }
除了反向迭代并不是那么明显的缺点(C 11反向范围的for-loop)外,它还受到您无法为迭代定义自定义步骤的事实。
有办法做到吗?我无法确定它,但想象一个适配器
template<typename T>
struct step
{
T const &container;
step( T const &cont, int aStep);
// provide begin() / end() member functions
// maybe overload the ++ operator for the iterators ?
};
for (auto i : step(vec, i)) {}
编辑:
讨论是关于实现类似于Pythons Generator的语义的讨论https://wiki.python.org/moin/generators,例如range()函数。请不要对这会如何增加代码复杂性发表毫无意义在C 中)我想探索写作的方法
for (auto i : range(vec, step))
由于新标准提供了使用这种语法的设施。range()函数将是一次性的努力,代码的用户不必担心Imlpementation的细节
基于范围的
for ( range_declaration : range_expression ) loop_statement
只采用begin
和end
迭代器,在此上执行前缀operator++
:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin)
{
range_declaration = *__begin;
loop_statement
}
}
其中 begin_expr
和 end_expr
"做正确的事情"(有关详细信息,请参见上面的链接)。您能做的就是将代理对象作为range_expression
提供,以便其迭代器完成您想要的工作。一个典型的例子是Boost的范围适配器库:
#include <boost/range/adaptor/strided.hpp>
#include <boost/range/adaptor/reversed.hpp>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> input = {1,2,3,4,5,6,7,8,9,10};
for(const auto& element : boost::adaptors::reverse(input))
std::cout << element << 'n';
std::cout << 'n';
for(const auto& element : boost::adaptors::stride(input,2))
std::cout << element << 'n';
}
在这里实时演示。
这与Python range
非常相似,实际上(如果不是更多的话)。您可以轻松编写自己的适配器,请参阅例如这个问题的答案。
此C -11功能主要是最常见情况的便利捷径。如果您想利用C/C for
环路的完整荣耀,最好以漫长的(遗产)方式来做。尝试智能技巧(例如定义奇怪的增量操作员)只会导致您的温柔读者(几周后您自己经常)完全感到困惑。试想一下,如果您需要在其他地方的一周中,您需要以一个而不是两个,而您不会注意到"智能"增量...这是一种介绍微妙的,不可能发现错误的好方法。
- 在基于范围的for循环中使用结构化绑定声明
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 为什么基于循环范围不直接在C 中使用参数阵列
- 为什么这个循环变量在循环范围之外是可访问的
- 在基于范围的循环范围内的双/整数使用和数据缩小
- 是cbegin/Cend不足以使循环范围
- 变量循环范围会导致返回局部变量的地址引用
- 地图元素上的循环范围
- 使用基于自动的范围用于循环VS,使用对循环范围的基于对的范围
- 访问 C++ 中 if 循环范围之外的矢量
- 循环范围内的初始值设定项列表
- 用于循环范围范围
- 为什么需要两个循环范围来更改C++向量的这些元素
- 在下一个循环之前访问基于 for 循环范围的下一个元素
- 在循环范围之外声明参数是否更有效?
- 循环范围拆分中的变量预评估
- 为什么我的循环范围不会改变元素?
- 我的循环范围不起作用
- 循环范围在使用索引元素时不起作用
- 对基于循环范围的误解