考虑以下玩具代码来确定范围是否包含元素:
template<typename Iter, typename T>
bool contains1(Iter begin, Iter end, const T& x)
{
for (; begin != end; ++begin)
{
if (*begin == x) return true;
}
return false;
}
(是的,我知道,标准库中已经有非常好的算法,这不是重点。)
如何使用 for_each
和 lambda 编写相同的内容?以下不起作用...
template<typename Iter, typename T>
bool contains2(Iter begin, Iter end, const T& x)
{
std::for_each(begin, end, [&x](const T& y) {
if (x == y) return true;
});
return false;
}
...因为那只会从 lambda 中返回,而不是从函数中返回。
我是否必须抛出异常才能退出 lambda?同样,对于这个特定问题,可能有十几个更好的解决方案根本不涉及 lambda,但这不是我想要的。
最佳答案
How would I write the same thing with
for_each
and a lambda?
你不能(撇开异常(exception))。您的函数不与 for-each 循环(= 一种映射)同构,就这么简单。
相反,您的函数是通过归约来描述的,因此如果您想使用高阶函数来替换它,请使用归约,而不是映射。
如果 C++ 有一个合适的通用reduce
,那么你的算法将如下所示:
template<typename Iter, typename T>
bool contains2(Iter begin, Iter end, const T& x)
{
return stdx::reduce(begin, end, [&x](const T& y, bool accumulator) {
return accumulator or x == y;
});
}
当然,只有当归约被适本地专门用于 bool 结果值时,这才会提前退出,以便短路。
唉,就我所见,C++ 不提供这样的功能。有accumulate
但这不会短路(它不能 - C++ 不知道 lambda 内部的操作 是短路的,并且它不是递归实现的)。
关于c++ - 如何从 lambda 中的函数返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291670/