gpt4 book ai didi

具有自定义步骤的循环的 C++ 范围

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:26 25 4
gpt4 key购买 nike

在 C++ 11 中,您可以使用循环范围遍历容器:

for (auto i : vec) { /* do stuff */ }

除了反向迭代的缺点不是那么明显 (C++11 reverse range-based 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)) {}

编辑:

讨论是关于实现类似于 Python 生成器的语义 https://wiki.python.org/moin/Generators例如 range() 函数。请不要对这会如何增加代码复杂性做出毫无意义的评论,没有人会回到用 Python 手工编写 for 循环,即使在 C++ 中情况并非如此(我应该再说一遍:情况并非如此在 c++ 中)我想探索编写的方法

for (auto i : range(vec, step))

因为新标准提供了使用这种语法的便利。 range() 函数是一次性的,代码的用户不必担心实现的细节

最佳答案

Range-based for ,

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_exprend_expr “做正确的事”(有关详细信息,请参见上面的链接)。您可以做的是提供一个代理对象作为 range_expression,以便它的迭代器执行您想要的操作。一个典型的例子是 Boost's range adaptors library :

#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';
}

Live demo here.

这与 Python range 非常相似,而且实际上同样(如果不是更强大的话)。您可以轻松编写自己的适配器,例如参见this question 的答案.

关于具有自定义步骤的循环的 C++ 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21517399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com