将递归转换为循环
Turn recursion into loop
我有一个未知类型的T
,可能是不可复制或移动分配的,一个基于现有T
计算并返回新的函数T op(const T &foo, Other bar)
,以及一个递归函数:
template<typename Iter, typename T>
T foldLeft(Iter first, Iter last, const T &z, std::function<T(T, Other)> op)
{
if (first == last) {
return z;
}
return foldLeft(std::next(first), last, op(z, *first), op);
}
编译器不能总是优化尾部调用,因为T
可能有一个重要的析构函数。我正在尝试用循环手动重写它,但无法弄清楚如何重新分配给z
.
您可以执行以下操作,但限制很奇怪,使用std::accumulate
似乎更简单
template<typename Iter, typename T, typename Fn>
T foldLeft(Iter first, Iter last, const T &z, Fn op)
{
std::aligned_storage_t<sizeof (T), alignof (T)> buf;
T* res = new (&buf) T(z);
for (auto it = first; it != last; ++it) {
auto&& res2 = op(res, it);
res->~T();
res = new (&buf) T(std::move(res2));
}
T final_res = *res;
res->~T();
return final_res;
}
请注意,它不是异常安全的。
相关文章:
- 将手写循环转换为标准库调用
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 如何将python的for循环转换为c++
- 将 NumPy 切片循环转换为C++
- 我想将这些循环转换为递归.是否可以将这些循环转换为递归
- 如何在C++中将基本嵌套循环转换为递归循环
- 如何将循环转换为递归
- 如何将 c++ 中的 for 循环转换为汇编程序
- 将多个循环转换为一个递归
- 将此 C++ for 循环转换为汇编语言
- 将while循环转换为等效的for循环
- 正在将for循环转换为OpenMP
- 将 while 循环转换为 do while 循环
- 在数组的每个元素中存储一个值:将C do{}while循环转换为MIPS asm
- 从嵌套的 for 循环转换为嵌套的 while 循环时出现问题
- 将C++ FOR循环转换为德尔福
- 将简单的for循环转换为while循环
- 将do-while循环转换为while循环
- 将while循环转换为for循环会导致无限循环
- 在C++中将 FOR 循环转换为 DO WHILE 循环