C++ c++;11 lambda表达式

C++ c++;11 lambda表达式,c++,c++11,lambda,C++,C++11,Lambda,今天我在做一些关于c++11的补习(因为我们还没有继续)。正如许多人所说的,转换的原因之一似乎是lambda表达式。我仍然不确定他们是如何提供新东西的 例如,使用c++11: #include <iostream> int main() { auto func = [] () { std::cout << "Hello world" << std::endl; }; func(); } #包括 int main() { auto func

今天我在做一些关于c++11的补习(因为我们还没有继续)。正如许多人所说的,转换的原因之一似乎是lambda表达式。我仍然不确定他们是如何提供新东西的

例如,使用c++11:

#include <iostream>

int main()
{
    auto func = [] () { std::cout << "Hello world" << std::endl; };

    func();
}
#包括
int main()
{
auto func=[](){std::cout非常详细地总结了主题的要点和更多内容。以下是突出的摘录:

lambda结合了函数指针和函数的优点 对象并避免其缺点。与函数对象一样 lambda是灵活的,可以维护状态,但与函数不同 对象,其紧凑语法不需要类定义 使用lambdas,您可以编写更简单、更简单的代码 比等效函数对象的代码更容易出错

网站上的例子显示了更多的差异和比较

另外,传统的观点是永远不要在C++中使用宏:


当与标准算法一起使用时,lambda的一个不太明显的好处是程序员不需要为lambda函数想出一个名称,并且

此外,通过标准算法执行的代码通常用于调用所提供范围内每个对象上的成员函数,并使用该函数或函数的名称,通常只是鹦鹉学舌地模仿被调用的成员函数的名称,而不增加代码的可读性。人为示例:

struct object
{
    void execute() const {}
};

void run_execute(object const& o) { o.execute(); }

std::vector<object> v;

std::for_each(v.begin(), v.end(), run_execute);

std::for_each(v.begin(), v.end(), [](object const& o) { o.execute(); });
struct对象
{
void execute()常量{}
};
void run_execute(object const&o){o.execute();}
std::向量v;
std::for_each(v.begin()、v.end()、run_execute);
std::for_each(v.begin()、v.end()、[](object const&o){o.execute();});

诚然,这是一个小小的好处,但仍然令人愉快。

例如,你不能在需要比较器的地方使用你的版本。而且宏是C残余。你是认真地将lambda函数与宏进行比较吗?不,我说在我看来,它们给出的结果是一样的,我只是问了一个问题,它们之间的区别是什么s、 我不太明白为什么这需要被否决或与“训练有素的海豚袭击者”相比。我没有投反对票。你的问题完全正确。宏是经过训练的海豚式攻击者。它们几乎是任何目的都能想到的最糟糕的工具。我不是说你或这个问题是经过训练的海豚式攻击者。@Lieuwe我没有投反对票,我只是被这个问题弄糊涂了。宏是邪恶的。它们只是一个文本替换工具。不可能进行任何错误检查。lambda是正确的函数。编译器实际上理解它们。
struct object
{
    void execute() const {}
};

void run_execute(object const& o) { o.execute(); }

std::vector<object> v;

std::for_each(v.begin(), v.end(), run_execute);

std::for_each(v.begin(), v.end(), [](object const& o) { o.execute(); });