C++11新特性(3) lambda表达式(1)
C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解.
lambda表达式包括下面部分.
[capture_block](parameters) mutable exception_specification->return_type {body}
如今分析各个部分的内容:
(capture_block)捕捉块:指定怎样捕捉所在作用域的变量,并供给lambda主体部分使用.
(parameter)參数(可选):lambda表达式使用的參数列表.仅仅有在不须要不论什么參数而且没有指定mutable,一个exception_specification和一个return_type的情况下能够忽略该列表.不论什么类型在某些情形下也是能够忽略的.比如:[]{return 10;};
mutable:(可选):假设所在作用域的变量是通过值捕捉的,那么lambda表达式的主体中就不能改动这些副本的值.这些副本默认标记为const,因此lambda表达式主体不能改动这些副本的值.假设lambda表达式标记为mutable,那么这些副本则不是const,因此主体能够改动这些本地副本.(类似于參数传递中的值传递以及引用传递改动源值)
exception_specification:(可选)用于指定lambda表达式能够抛出的异常.
Return_type(可选)返回值的类型:假设忽略了return_type,那么编译器会依据下面原则推断返回类型:
1)假设lambda表达式主体的形式为{return exception;},那么lambda表达式的return_type为exception的类型;
2)其它情况下的return_type为void.
以下看一些样例:
//test2.cpp
#include <iostream>
using namespace std;
int main(){
[]{cout<<"hello lambda!"<<endl;}();
}
看编译以及执行的结果
来剖析一下这个lambda表达式的各部分
[]{cout<<"hello lambda!"<<endl;}();
[]:这是捕捉块,參数为空;
{cout<<"hello lambda!"<<endl;}:这是body
():这是为了让该lambda表达式马上运行.
由于实际上[]{cout<<"hello lambda!"<<endl;}就是lambda表达式的全部组成部分,其功能类似于一个匿名的函数,要让其马上运行,必须调用该函数,而该函数是匿名的,该怎样调用呢?
事实上[]{cout<<"hello lambda!"<<endl;}就相当于函数的名称了,由于其參数为空,因此仅仅须要传递一个空參就可以调用,要验证也是非常easy的,比如
#include <iostream>
using namespace std;
int main(){
[](int n){cout<<"hello lambda!+"<<n<<endl;}(10086);
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
能够非常easy看出当中的规律!
再看一个复杂一点的拥有返回值的lambda表达式.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string result=[](const string &str)->string{return "this is "+str;}("lambda!");
cout<<result<<endl;
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
string result=[](const string &str)->string{return "this is "+str;}("lambda!");
这个样例里面指明了这个lambda返回值为string!
当然,这个返回值也是能够忽略的,返回值就是"this is "+str的类型,非常明显,这是一个string类型.
还能够保存指向lambda表达式的指针,这样就能够非常方便的调用该lambda表达式,使用C++11中的autokeyword进行声明.比如:
#include <iostream>
#include <string>
using namespace std;
int main()
{
auto func=[](const string &str){return "this is "+str;};
cout<<func(" one!")<<endl;
cout<<func(" two!")<<endl;
}
这样,就能够对lambda表达式进行代码重用了!
对lambda的基本介绍就到这里了,更深入的内容请看下一章.
C++11新特性(3) lambda表达式(1)的更多相关文章
- C++11新特性之一——Lambda表达式
C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...
- c++11 新特性之lambda表达式
写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...
- C++11 新特性:Lambda 表达式
参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbits_lambda_expressions 或许,Lambda 表达式算得上是 C++ 1 ...
- C++11 新特性之 Lambda表达式
lambda表达式能够用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法例如以下: [函数对象參数](操作符重载函数參数)->返回值类型{函数体} []内的參数指的是Lambda表 ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- Java8新特性之Lambda表达式
lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...
- 夯实Java基础(二十二)——Java8新特性之Lambda表达式
1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...
随机推荐
- 02day1
淘汰赛制 递推 [问题描述] 淘汰赛制是一种极其残酷的比赛制度.2^n名选手分别标号1,2,3,…,2^n-1,2^n,他们将要参加n轮的激烈角逐.每一轮中,将所有参加该轮的选手按标号从小到大排序后, ...
- 【转】个人常用iOS第三方库以及XCode插件介绍 -- 不错
原文网址:http://adad184.com/2015/07/08/my-favorite-libraries-and-plugins/ 第三方库是现在的程序员离不开的东西 不光是APP开发 基本上 ...
- 一个好用的hibernate泛型dao
以前从springside2.0上搞下来的很好用的,基本实现dao零编码只要配置xml文件就行了. 先看图: 一共4层,com.demonstration.hibernate.basedao是我加的用 ...
- 【转】使用NetBeans和Eclipse开发PHP应用程序
[51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...
- iBatis 和MyBatis区别
从 iBatis 到 MyBatis ,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 ...
- 使用SQL语句清空数据库所有表的数据
使用SQL语句清空数据库所有表的数据 近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进 ...
- Educational Codeforces Round 15 套题
这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib& ...
- HTTP协议学习笔记-2
HTTP报文 HTTP报文分为请求报文和响应报文(requeset and response) 请求报文的格式: <method> <request -URL> <ve ...
- 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
以数组的方法: public static void main(String[] args) { final int n = 10; final int k = 1; ...
- 结合Vim ghostscript 将源代码文件转换成语法高亮的pdf格式文档
step 1: 安装ghostscript (debian 环境, 其他环境自行google) sudo apt-get install ghostscript step 2: 用Vim生成ps文件 ...