考虑以下这个玩具代码,用于确定一个范围是否包含一个元素:
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,但这不是我要问的。
bool operator()( const T& )
,但是您的实现在x!=y
时未返回该函数。话虽如此,您想要做的更像是find_if
而不是for_each
(一旦函数被更正)。 - David Rodríguez - dribeasstd::for_each
的流程控制。忽略函数对象的lambda特性,假设你将一个普通函数传递给for_each
。你需要一个函数返回到上面两个级别,而第一个级别不知道它的存在。你是正确的,异常是唯一的方法。但是,你不应该这样做。概念本身没有任何问题,除了C/C++/algol等语言不支持这种语法。你正在滥用异常来创建一种语言特性。 - deft_code