这是我在做题过程中碰见高手写了一个这样的代码,然后来学习的。
匿名函数对象还是挺有用的,很方便。
std::string str;
std::cin >> str;
//提供一个匿名函数用于判断字符是不是奇数
std::count_if(str.begin(), str.end(), [](char c) {
return (c - '0') & 1
});
Lambda 表达式(Lambda Expression)是 C++11 引入的一个特性,它允许你创建匿名函数对象。Lambda 表达式提供了一种简洁的方式来定义一个函数,而不需要显式地定义一个函数类型或者函数名。Lambda 表达式通常用于临时创建一个小型的、一次性的函数,这些函数可以捕获(capture)其创建时所在作用域的变量。
Lambda 表达式的一般语法如下:
[] (参数列表) -> 返回类型 { // 函数体 }
[]
是 Lambda 表达式的开始,它定义了捕获列表。捕获列表指定了哪些外部变量可以在 Lambda 表达式内部使用。参数列表
是 Lambda 表达式的输入参数,类似于普通函数的参数列表。如果 Lambda 不需要任何参数,参数列表可以为空。->
指定了 Lambda 表达式的返回类型。如果 Lambda 表达式包含一个单一的返回语句,且没有返回值,可以省略返回类型,编译器会根据上下文推断返回类型。- Lambda 表达式的主体是一段代码块,它定义了 Lambda 表达式的行为。
Lambda 表达式可以捕获其创建时所在作用域的变量,这些变量可以按值(by value)或按引用(by reference)被捕获。捕获方式可以在捕获列表中指定。
以下是一些 Lambda 表达式的示例:
// 没有参数,没有返回值的 Lambda 表达式
auto lambda1 = [] {
std::cout << "Hello, World!" << std::endl;
};
// 带参数的 Lambda 表达式
auto lambda2 = [](int a, int b) -> int {
return a + b;
};
// 捕获外部变量的 Lambda 表达式
int x = 10;
auto lambda3 = [x]() {
std::cout << "The value of x is: " << x << std::endl;
};
// 捕获变量 x 按引用,并修改它
auto lambda4 = [&x]() {
x = 20;
std::cout << "Changed the value of x to: " << x << std::endl;
};
Lambda 表达式在 STL 算法(如 std::sort
、std::for_each
等)中非常有用,因为它们允许你传递一个自定义的函数作为参数。此外,Lambda 表达式也常用于并发编程、事件处理和回调函数等场景。