从迭代函数应用程序中生成一个范围
Make a range from Iterated function application
如果我有一个函数
std::array<unsigned,2> fib(std::array<unsigned,2> p)
{
return {p[1],p[1]+p[0]};
}
我想有一种方法优雅地生成无限程
[x,fib(x),fib(fib(x)),fib(fib(fib(x))),...]
这种情况经常出现,我需要找到最好的方法来做到这一点?
我发现这个回购的生成器运行良好:
template<typename F, typename Arg>
tl::generator<Arg> iterated_application(F fn, Arg x) {
while (true) {
co_yield x;
x = fn(x);
}
}
可以用作
int main()
{
auto fib = [](auto a) {return std::array{ a[1],a[1] + a[0] }; };
for (auto i : iterated_application(fib, std::array{ 0,1 })
| std::views::keys
| std::views::take(10))
std::cout << i << std::endl;
}
https://godbolt.org/z/v73zvY9cM
您可以始终创建自己的迭代器:
template<typename Arg>
struct impl_iterated_application {
using value_type = Arg;
using difference_type = std::ptrdiff_t;
using iterator_category = std::forward_iterator_tag;
const Arg& operator*() const { return current; }
impl_iterated_application& operator++()
{
current = fn(current);
return *this;
}
auto operator++(int) { auto temp = *this; ++* this; return temp; }
impl_iterated_application(std::function<Arg(Arg)> f = std::identity{}, Arg initial = {}) : current(initial), fn(f)
{}
//bool operator==(const impl_iterated& other) const = default;
private:
Arg current;
std::function<Arg(Arg)> fn;
};
你会在这个工厂功能中使用:
template<typename F, typename Arg>
auto iterated_application(F fn, Arg x)
{
return std::ranges::subrange(impl_iterated_application(std::function<Arg(Arg)>{fn}, x), std::unreachable_sentinel);
}
https://godbolt.org/z/dxvn54ffv
我认为联合程序生成器就是这样做的。我应该试着https://github.com/lewissbaker/cppcoro工作
我想你可能有点滥用,使用部分和,忽略调整范围中的第一个元素:
auto fib = ranges::views::repeat(std::array{ 0,1 })
| ranges::views::partial_sum([](auto a, auto){ return std::array{ a[1], a[0] + a[1] }; });
for (auto elem : fib | ranges::views::take(10))
std::cout << elem[0] << std::endl;
template<typename Arg, std::invocable<Arg> F>
auto iterated_application(F fn, Arg x)
{
return ranges::views::generate(
[p = x, f=fn]() mutable
{
auto p0 = p;
p = f(p);
return p0;
});
}
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何设置一个范围来提取我想要获得的信息
- 不计算一个范围内的完美数
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 在 C++20 中将多个范围适配器连接到一个范围中
- 如何将一个范围替换为矢量中的另一个范围?
- 将整数范围映射到另一个范围
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 我已经编写了C++代码将 boost::optional 视为一个范围,但它无法编译
- 当在另一个范围中,将SelfAdjointeigensolver保存为成员的结果被重新引入
- C :在一个范围内计数偶数 /奇数
- 删除重复的元素并给出一个范围总和
- 为什么即将到来的范围库不支持一个范围的容器初始化
- 将无符号整数加法/减法括在一个范围周围
- 更快的方法将数字从范围转换为另一个范围
- 在一个范围内的阵列中找到三胞胎
- 如何在C++中选择多维数组中的一个范围
- 如何检查一个范围内的值是否是另一个范围内的值的倍数
- 将 std::vector<int> 设置为一个范围
- 正在检查排序列表中是否有一个范围内的数字