1. Lambda函数概述
在C++11中,引入了Lambda表达式,它是一种可定义匿名函数的方式,可以与STL中的算法函数和容器一起使用。
一个最简单的Lambda表达式如下:
[](){ return true; }
其中,[]表示捕获器,()表示参数列表,{}表示函数体。
Lambda函数可以省略参数列表和返回类型:
[]() {std::cout << "Hello world!"; }
使用Lambda函数可以大大简化代码:
std::vector<int> v{1, 2, 3, 4, 5};
std::for_each(v.begin(), v.end(), [](int n){std::cout << n << " ";});
Lambda函数也可以被赋值给变量,以便多次调用:
auto f = [](int n){return n*n;};
std::cout << f(5) << std::endl;
2. Lambda函数应用场景
2.1. STL算法函数中使用Lambda函数
STL算法函数如std::sort,std::for_each等多数支持Lambda表达式,例如下面的std::sort函数:
std::vector<int> v{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
std::sort(v.begin(), v.end(), [](int a, int b){ return a < b; });
这里的Lambda函数作为std::sort函数的第三个参数,用于指定比较规则。Lambda函数可以根据具体需求返回true或false,从而指定排序规则,例如本例中的排序规则是升序。
同样的,std::for_each函数也可以使用Lambda函数:
std::vector<int> v{1, 2, 3, 4, 5};
std::for_each(v.begin(), v.end(), [](int n){std::cout << n << " ";});
这里使用Lambda函数输出向量中的每个元素。
2.2. 函数对象中使用Lambda函数
函数对象(Functor)是一种可以当做函数来使用的对象,它重载了()运算符。我们可以为函数对象定义Lambda表达式,以便于快速地定义一个特定的函数,例如:
struct myFunctor {
double operator()(double x, double y) const {return x*y;};
};
auto myLambda = [](double x, double y){return x*y;};
这里定义了一个myFunctor类,重载了()运算符,用于计算两个double类型数值的积。同时定义了一个具有相同功能的Lambda函数myLambda。
不难看出,在使用时两者作用相同,但Lambda函数更为简单快捷。
2.3. 多线程编程中使用Lambda函数
多线程中经常需要传递函数对象,这时可以使用Lambda函数来定义函数对象,以便于传递参数和快速定义函数,例如:
std::thread t([](int n){std::cout << n << std::endl;}, 3);
t.join();
这里定义了一个匿名的Lambda函数,并将其作为第一个参数传递给std::thread构造函数,以便创建一个新线程。同时在std::thread构造函数中,也可以传递其他参数给该Lambda函数。
2.4. 其他应用场景
Lambda函数还可以用于智能指针和容器等C++使用场景中,以便于快速定义特定的函数。Lambda函数也可以用于函数调用和作为参数传递;可以作为返回值和其他Lambda函数的参数。
3. 总结
Lambda函数是一种可定义匿名函数的方式。在C++11中,STL算法函数和多线程编程等多种使用场景都支持Lambda表达式,它使得代码更加简化和可读性更高。Lambda函数还可以定义函数对象,并在智能指针和容器等C++使用场景中使用。
需要注意的是,在Lambda函数中可能涉及到其他变量的访问和更新,因此需要遵守变量的访问规则,以避免出现不可预期的错误。