在c ++ 11中,您可以遍历带有range for循环的容器:
for (auto i : vec) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
除了反向迭代不那么明显(C++ 11基于反向范围的for循环)的缺点之外,它还受到无法为迭代定义自定义步骤这一事实的限制.
有办法吗?我无法理解它,但想象一下适配器
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)) {}
Run Code Online (Sandbox Code Playgroud)
编辑:
讨论是关于实现类似于Pythons生成器https://wiki.python.org/moin/Generators的语义,例如range()函数.请不要对这会如何增加代码复杂性做出毫无意义的评论,没有人回过头来编写Python中的循环,尽管在C++中并非如此(我应该再说一遍:情况并非如此)在c ++)我想探索写作方式
for (auto i : range(vec, step))
Run Code Online (Sandbox Code Playgroud)
因为新标准提供了使用这种语法的工具.range()函数将是一次性的努力,代码的用户不必担心imlpementation的细节
for ( range_declaration : range_expression ) loop_statement
Run Code Online (Sandbox Code Playgroud)
只需要一个begin
和一个end
迭代器,operator++
对它们执行前缀,如下所示:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin)
{
range_declaration = *__begin;
loop_statement
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里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';
}
Run Code Online (Sandbox Code Playgroud)
这非常相似,几乎同样(如果不是更多)功能强大的Python range
.您可以轻松编写自己的适配器,例如查看此问题的答案.
归档时间: |
|
查看次数: |
2112 次 |
最近记录: |