C++11 里lambda表达式的学习
最近看到很多关于C++11的文档,有些是我不怎么用到,所以就略过去了,但是lambda表达式还是比较常用的,其实最开始学习python的时候就觉得lambda这个比较高级,为什么C++这么弱。果然C++增加这个东西。
语法
[
capture]
(
params)
mutable exception attribute->
ret{
body}
(1)
[
capture]
(
params)
->
ret{
body}
(2)
[
capture]
(
params)
{
body}
(3)[ capture ] { body } (4)
解释
capture - 指定哪些在函数声明处的作用域中可见的符号将在函数体内可见。
符号表可按如下规则传入:[=,&b],按引用捕获b,其他局部变量都按值捕获
[this],按值捕获了this指针
[&] 按引用捕获在lambda表达式所在函数的函数体中提及的全部自动储存持续性变量
[=] 按值捕获在lambda表达式所在函数的函数体中提及的全部自动储存持续性变量
[] 什么也没有捕获params - 参数列表,与命名函数一样
ret - 返回值类型。如果不存在,它由该函数的return语句来隐式决定(或者是void,例如当它不返回任何值的时候)
body - 函数体
例子
/*[] 什么也没有捕获*/
auto x = [](){cout<<"Lambda is woring"<<endl;};
x();
/*[=] 按值捕获*/
int n=;
int m=;;
string s="many";
auto a= [n](string &s) mutable {n++;return s.size()>n;} ;
a(s);
cout<<n<<endl; //n=3 auto d = [m](string &s) mutable {m++;n++; return s.size()>m;};
cout<<"m="<<m<<", n="<<n<<endl; //error, n没有捕获
这个地方不知道为什么必须用mutable,不然编译不过。可能是值捕获的关系吧。
/*[&] 按引用捕获*/
int n=;
string s="many";
auto b= [&n](string &s) {n++;return s.size()>n;};
b(s);
cout<<n<<endl; //n=4
/*[=, &foo] 除了foo引用捕获,其他局部变量全部值捕获*/
int n=;
int m=;
string s="many";
auto c = [=,&n](string &s) mutable {m++;n++; return s.size()>m;};
c(s);
cout<<"m="<<m<<", n="<<n<<endl; //m=4,n=4
/*[this],按值捕获了this指针 */
class A
{
private:
int z;
public:
A(){z=;}
void fun(int m)
{
auto a = [this](int m) {return this->z+m;};
cout<<a(m)<<endl;
}
}; int main ()
{
A *a =new A();
a->fun(); //5
return ;
}
C++11 里lambda表达式的学习的更多相关文章
- 「C++11」Lambda 表达式
维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...
- C++11之lambda表达式
lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.lambda表达式的类型在C++11中被称为"闭包类型",也可以 ...
- 【C++11】 lambda表达式
i.e.int x = 10;int y = 20;int z = [&]{ x = x * x; y = y * y; return x + y;}(); 上面z后面以[]开头的为一个lam ...
- 【Java】Java8新增的Lambda表达式_学习笔记
一.Lambda表达式可以简化创建匿名内部类对象 1.不需要new XXX(){}这种繁琐代码. 2.不需要指出重写的方法名. 3.不要给出重写的方法的返回值类型. 4.Lambda相当于一个匿名方法 ...
- Spring8中lambda表达式的学习(Function接口、BiFunction接口、Consumer接口)
代码重构,为了确保功能的等效性,梳理代码时,发现如下代码: public SingleRespTTO fundI(SingleReqTTO request) throws Exception { re ...
- C++11之lambda表达式应用
应用 foreach语句中 #include <time.h> #include <algorithm> using namespace std; void func(int ...
- C++11之lambda表达式解析
什么是Lanmbda? 简短函数,就地书写.常用于向函数(算法)传递函数参数. 语法 Lambda 表达式,[capture](paras)mutable->return type{statem ...
- c++11:lambda表达式的使用
lambda表达式的一般形式: [capture list] (parameter list) -> return type{function body}; 其中,capture list (捕 ...
- lambda表达式的学习
Lambda表达式 为什么使用lambda表达式 Lambda表达式可以简化我们的代码,使我们只需要关注主要的代码就可以. //测试用的实体类 public class Employee { priv ...
随机推荐
- CentOS 7.0 防火墙
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙.firewall:systemctl start firewalld.service#启动firewalls ...
- TLE之前,没有一个节点叫失败!!!
我想我十八年来记忆最深刻的夜晚,大概便是在吉林大学燥热的宿舍里,穿着橘黄色的短袖,努力咽下大口大口的雪碧.那天晚上我仰躺在吉大热得几乎不能入眠的床板上,一动不动,看夏夜里打不尽的蚊子在惨白的天花板下飞 ...
- python多进程理论
什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 你在一个时间段内有很多任务要做:python学习的任务,赚钱的任务,交女朋 ...
- Jetty VS Tomcat
Tomcat 经过长时间的发展,它已经广泛的被市场接受和认可,尤其在企业级应用方面,Tomcat 仍然是第一选择.但是随着 Jetty 的发展,Jetty 的市场份 额也在不断提高. 1.架构 Jet ...
- 学习pyhton需要做哪些准备工作
1:知道python个版本是有差异的 2:既然有差异,那么如何在不同项目不同版本的开发环境; ----------------------------------------------------- ...
- Tensorflow瞎搞
Tensorflow为张量从流图的一端流动到另一端的计算过程,Tensorflow也可以看成是将复杂的数据结构传输至人工智能神经网络中进行分析和处理的系统. 张量概念是矢量概念的推广,矢量是一阶张量. ...
- github 上 机器学习 的库推荐列表
awesome-machine-learning: https://github.com/josephmisiti/awesome-machine-learning
- CentOS Linux中zip压缩和unzip解压缩命令详解
以下命令均在/home目录下操作cd /home #进入/home目录1.把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip myda ...
- BAPI_ACC_DOCUMENT_POST 解决原因代码输入问题-利用BADI
(1) 复制函数SAMPLE_INTERFACE_RWBAPI01为Z SAMPLE_INTERFACE_RWBAPI01 *"---------------------------- ...
- Python基础-os和sys模块
os模块提供对操作系统进行调用的接口 import os os.getcwd() # 获取当前工作目录 os.chdir(r'd:\fansik') # 修改对当前工作目录 print(os.curd ...