C++ “的优点是什么?”;lambda表达式;?

C++ “的优点是什么?”;lambda表达式;?,c++,syntax,lambda,C++,Syntax,Lambda,lambda表达式的原因是以“更方便的方式”隐式生成函数对象。正如您从下面的示例中看到的,它不仅不太方便,而且篇幅较长,而且语法和符号混乱 这有什么用途吗?它实际上使代码更具可读性 cout << count(vec, [&](int a){ return a < x; }) << endl; // lambda cout << count(vec, Less_than<int> (x)) << endl;

lambda表达式的原因是以“更方便的方式”隐式生成函数对象。正如您从下面的示例中看到的,它不仅不太方便,而且篇幅较长,而且语法和符号混乱

这有什么用途吗?它实际上使代码更具可读性

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

cout它更具可读性,因为它将函数的实现放在调用它的位置,从而保持自然的自上而下的代码流不变

你看,普通函数有其优缺点。一方面,函数有助于减少代码中的重复,这使得代码更结构化、更可读。另一方面,函数打破了代码的自然流动,并将控制转移到完全不同的位置。这会降低可读性,原因很明显:这就像读一本充满前后嵌套引用的书一样

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


但对于小型“一次性”一次性使用实用程序代码,普通函数的工作效果并不理想。它们实际上会使代码的可读性大大降低。这就是lambda函数的用武之地。它们允许将一次性实用程序代码直接注入到调用点,这是必要的。

lambda表达式的存在是为了简化代码。这:

auto fun = []() { return; };
由编译器替换为:

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

// local scope
__lambda_1 fun{};
这是lambda语法的主要动机:用在需要的站点声明的更易于阅读的匿名函数替换传统函数对象,而不是在另一个作用域中声明单独的函数对象。它不仅仅是替换命名的函数对象

实际上,标准库包括许多命名函数对象,如
std::unary_function
std::less
。但这些对象的实用性有限,无法承担lambda可能承担的所有潜在角色


因此,是的,它可以通过将标准库无法提供的代码精确地放置在需要的位置,而不会用十几行
struct
s污染代码,也不会用可能只使用一两次的名称污染名称空间,从而使代码更具可读性。

lambda版本不再适用。非lambda定义是不完整的,因为我们没有
Less\u than
的定义。那
Less\u than(x)
是一个“正常函数定义”吗???根据第一个示例判断,似乎需要将
x
的值绑定到一个双参数comparator functor,将其转换为一个单参数comparator。这已经是远远超出“普通函数定义”的功能。另外一点是,lambda函数可以直接访问父上下文范围内的变量(例如,在这种情况下,lambda可以在需要时直接访问“vec”)这是不必创建单独函数的一部分功能。@AnT因此,总结一下,提高可读性是lambda表达式的主要优点。把逻辑放在调用函数中,减少“一次性”函数,就这样?请原谅我的无知,我仍在努力了解lambda表达式的一些杰出用途,如果有的话!