“lambda表达式”的优势是什么?

13

lambda表达式的原因在于以“更方便的方式”隐式生成函数对象。正如下面的示例所示,它不仅不够方便且代码量更多,而且具有令人困惑的语法和符号。

在哪些情况下可以使用它,从而使得代码更易读?

cout << count(vec, [&](int a){ return a < x; }) << endl;  // lambda
cout << count(vec, Less_than<int> (x)) << endl;           // normal functor def-n

3
Lambda版本已经不再存在。非Lambda版本不完整,因为我们没有“Less_than”的定义。 - Benjamin Lindley
Less_than<int> (x)怎么可能是“普通函数定义”???从你的第一个例子来看,似乎你需要将x的值绑定到一个双参数比较器函数对象上,将其转换为单参数比较器。这已经超出了“普通函数定义”的功能范畴。 - AnT stands with Russia
2个回答

24

使用lambda函数更易于阅读,因为它将函数的实现直接放在调用点,从而保持了自然的从上到下的代码流。

你知道,普通函数有其优点和缺点。一方面,函数帮助减少代码中的重复,使代码更加结构化和易读。另一方面,函数打破了代码的自然流程并将控制传递到完全不同的位置。由于显而易见的原因,这可能会降低可读性:就像阅读充满嵌套前向和后向引用的书。

因此,为了正确地利用常规函数的特性,应该使用它们来实现经过深思熟虑、完整且隔离的抽象。这样,普通函数将提高代码的可读性。

但是对于小型的“一次性”一次性使用的实用程序代码,普通函数效果不佳。它们实际上会使代码显着变得不易读取。这就是lambda函数的发挥作用的地方。它们允许将一次性实用程序代码直接注入到需要的调用点。


2
另外一个要点是,Lambda函数可以直接访问父级上下文中的变量(在这种情况下,如果需要,Lambda可以直接访问“vec”)。 这是不必创建单独函数的实用性的一部分。 - Brad Peabody
2
@AnT 所以如果我们总结一下,提高可读性是lambda表达式的主要优点。通过将逻辑放在调用函数中并减少“一次性”函数,就可以实现这一点?请原谅我的无知,我仍在努力看到lambda表达式的某些独特效用,如果有的话! - Yogesh

4
lambda表达式存在的目的是为了简化代码。这段代码:
auto fun = []() { return; };

被编译器替换为:

// Namespace scope
struct __lambda_1 {
    void operator()() { return; }
};

// local scope
__lambda_1 fun{};

这是lambda语法的主要动机:用一个更易于阅读的匿名函数代替传统的函数对象,该函数在需要的地方声明,而不是在另一个范围中声明一个单独的函数对象。它的目的并不仅仅是替换命名函数对象。
确实,标准库包括许多命名函数对象,如std::unary_function和像std::less这样的东西。但这些对象的效用有限,并不能承担lambda能承担的每个潜在角色。
所以,是的,通过将标准库没有提供的代码精确定位到所需位置,它可以使代码更易读,而不会用十行的结构体污染您的代码,并在名称空间中污染您可能只使用一两次的名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接