刚开始看lambda表达式有种懵逼的感觉,和平时的语法习惯太格格不入了,但是后来看了一些介绍后才发现这个新特性还是挺好用的,要问我lambda表达式是什么,其实它是一个函数,一个匿名函数,通常是我们需要一个函数,但是又不想费神去命名一个函数,这个时候我们可以使用lambda表达式。
lambda表达式是由这几部分构成的:
1.[] Capture 子句(在 C++ 规范中也称为 lambda 引导。)
2.() 参数列表(也称为 lambda 声明符)
3. mutable 可变规范,表示运行函数体修改通过拷贝捕获的参数
4.异常规范,声明可能抛出的异常
5.尾随返回类型。
6.{}“lambda 体
需要特别注意的是,除了Capture字句和lambda函数体不能省略之外,剩下的四部分均可以根据要求省略。
比如我想写一个函数打印hello world,按照函数习惯需要命名一个函数,然后在主函数中调用,但是用lambda表达式我们可以这样写:
int main()
{
auto f = [](){cout << "Hello World" <<endl; };
f();
return 0;
}
运行结果会打印输出Hello World。
下面我们再来看一个小程序:
int main()
{
int i = 0;
cout << i << endl;
auto f=[=]()mutable{cout << ++i << endl; };
f();
cout << i << endl;
return 0;
}
输出结果是0 1 0,我们发现capture字句中多了个=符号,这代表把外部变量i拷贝一份传进了函数体进行操作,所以才会输出0 1 0.要注意的是,此处的mutable不能省略,因为我们在函数体中改变了外部变量i的值。
如果把=改成&呢?我们来试一试:
auto f=[&]()mutable{cout << ++i << endl; };
输出结果:0 1 1.引用改变的是自身的值。
lambda表达式有什么用呢? lambda的作用就是创建一个临时匿名函数,想想有STL算法中很多需要传递谓词函数,比如count_if。假如我有一个字符串容器,我需要统计长度大于3的个数,则可以这样:
vector<string> s = { "1", "11", "111", "1111", "11111", "111111", "1111111" };
cout << count_if(begin(s), end(s), [](string s){return s.size() > 4; });
这样比较简洁,不必再重新声明一个函数了。
阅读后请留下你们的脚印,欢迎斧正,谢谢!