Lambda 是 C++ 中的匿名函数(即没有函数名的函数),可以在定义和使用时内联。它们提供了一种方便的方式,将小的代码块作为参数传递给其他函数,或者在不需要创建命名函数的情况下定义一个函数。
目前成都创新互联已为千余家的企业提供了网站建设、域名、雅安服务器托管、绵阳服务器托管、企业网站设计、克山网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
Lambda 在 C++ 中提供了一种灵活而简洁的方式来编写类似函数的对象,并在现代 C++ 编程中被广泛使用。
Lambda 的定义使用以下语法:
[ capture list ] ( argument list ) -> return type { function body }
捕获列表(capture list)用于指定 lambda 中可访问的来自外部作用域的变量。变量可以通过值捕获、引用捕获或使用 this 捕获。
以下是在C++中使用 lambda 的几种不同方式。
函数回调是将一个函数作为参数传递给另一个函数,并在接收函数稍后的时间调用该函数。您可以将 lambda 作为函数参数传递,其中它将在发生某个事件时执行。
示例:
#include
#include
#include
int main() {
std::vectornumbers = {1, 2, 3, 4, 5};
// Lambda 表达式,用于查找两个数字的和
auto sum = [](int a, int b) { return a + b; };
int result = std::accumulate(numbers.begin(), numbers.end(), 0, sum);
std::cout << "Sum of elements in the vector: " << result << std::endl;
return 0;
}
在这个例子中,sum 变量是一个Lambda表达式,它接受两个参数 a 和 b,并返回它们的总和。std::accumulate 函数接受数字向量、结果的初始值和 sum 函数(Lambda 表达式)。该函数计算向量中所有元素的总和并返回结果,该结果被打印在屏幕上。
另一个例子:
#include
#include
#include
int main()
{
std::vectorvec = { 1, 2, 3, 4, 5 };
int sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int x) { sum += x; });
std::cout << "The sum is: " << sum << std::endl;
return 0;
}
在这种情况下,lambda 表达式 [&sum](int x) { sum += x; } 被传递作为要应用于每个元素的函数。lambda 通过引用 & 捕获变量 sum,以便可以在 lambda 主体中进行修改。
两个例子都达到了相同的结果,但第二个例子使用了 std::for_each 算法和 lambda 表达式,这是在 C++ 中更现代、更简洁的技术。
当一个 lambda 表达式被声明时没有任何显式的捕获,其默认行为是通过引用捕获周围作用域中的变量。这被称为默认捕获。
例子:
#include
int main() {
int x = 42;
auto f = [ ]() { std::cout << x << std::endl; };
f();
return 0;
}
#include
int main()
{
auto square = [](int x) { return x * x; };
std::cout << "The square of 5 is: " << square(5) << std::endl;
return 0;
}
在第二个例子中,定义了一个 lambda 表达式并将其存储在名为 square 的变量中。这个 lambda 表达式接受一个 int 类型的参数 x,并返回 x * x 的值,即参数的平方。
在主函数中,这个 lambda 表达式被用作函数对象。通过传递一个值为 5 的参数来调用它,并使用 cout 流显示结果。
这是 lambda 表达式的最简单形式,其中你通过值传递变量给函数。当一个变量被按值捕获时,它的当前值被存储在闭包中,而当周围作用域中的变量发生改变时,它的值不会被更新。这可以通过将变量包含在方括号 [ ] 中来实现。
例子:
#include
int main() {
int x = 42;
auto f = [x]() { std::cout << x << std::endl; };
f();
return 0;
}
#include
int main() {
int x = 42;
auto f = [x](int y) { std::cout << x+y << std::endl;};
f(1);
return 0;
}
你可以通过使用 & 符号将变量传递给 lambda 表达式来按引用捕获变量。当一个变量被按引用捕获时,它的当前值被存储在闭包中,并且在周围作用域中变量发生变化时被更新。这是通过在方括号[ ]中在变量前加上取地址运算符 & 来实现的。
例子:
#include
int main() {
int x = 42;
auto f = [&x]() { std::cout << x << std::endl; };
f();
return 0;
}
#include
int main() {
int x = 10;
auto add_one = [&x]() { ++x; };
add_one();
std::cout << x << "\n";
return 0;
}
#include
int main() {
int x = 42;
auto f = [&x]() { std::cout << x << std::endl; };
f();
return 0;
}
默认情况下,由 lambda 表达式捕获的变量是常量,不能在 lambda 表达式体内修改。如果你想要在 lambda 表达式中修改捕获的变量,你可以将 lambda 表达式设为可变。可变lambda允许捕获的变量被修改。这是通过在方括号 [ ] 中包含可变关键字来实现的。
例子:
#include
int main() {
int x = 42;
auto f = [x]() mutable { std::cout << ++x << std::endl; };
f();
return 0;
}
lambda 表达式类似于普通函数,但它们有一些关键的区别。例如,lambda 表达式的类型没有被显式指定,但可以由编译器推断出来。此外,lambda 表达式可以从周围的作用域中捕获变量,这使得它们非常适用于创建闭包和在 C++ 中使用函数式编程概念。
与传统函数相比,lambda 表达式具有一些性能优势:
总之,与传统函数相比,lambdas 可以通过减少开销、提高缓存位置、减少代码大小、提高灵活性和提高可读性来提高性能。
分享题目:释放C++中Lambda表达式的强大威力
网址分享:http://www.shufengxianlan.com/qtweb/news26/64026.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联