浅谈lambda表达式

原创 2015年11月20日 13:01:16

刚开始看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; });

这样比较简洁,不必再重新声明一个函数了。


阅读后请留下你们的脚印,欢迎斧正,谢谢!


相关文章推荐

c++11 lambda表达式浅谈

最近在看各种源代码。

java 8新特性lambda表达式优劣浅谈

最近学习了lambda表达式的用法,就把自己的小项目中所有用到接口回调的地方全都用上了lambda表达式,代码的确精简了不少,不仅是接口回调处,由于其参数类型推断,还减少了不少import语句。 虽然...

Java 1.8 lambda表达式示例源码

  • 2016年11月28日 11:46
  • 11KB
  • 下载

委托、事件、Lambda表达式Demo

  • 2015年03月12日 18:07
  • 58KB
  • 下载

再谈Comparator-使用lambda表达式

关于Comparable和Comparator 的区别以及作用: 1. Java 中 Comparable 和 Comparator 比较 - 如果天空不死 - 博客园 2. 深入理解J...

Java8的lambda表达式

  • 2017年07月24日 11:54
  • 11KB
  • 下载

Lambda表达式 c# 经验谈:巧用Expression表达式 解决类似于sql中 select in 的查询(适合于中小型项目)

我们在项目经常会碰到一些特殊需求 例如下拉框是复选的,查询条件是根据下拉框中复选项进行拼接 看到此图后大家肯定会说,这很简单嘛 将所有的选项 拼成“'1-3','5-9'”  然后放到 in ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈lambda表达式
举报原因:
原因补充:

(最多只允许输入30个字)