C++11 Lambda函数
Lambda函数
[捕捉列表] (参数) mutable -> 返回值类型 {函数体}
- []是lambda的引出符,捕捉列表能够捕捉上下文中的变量,来供lambda函数使用:
- 参数列表与普通函数的参数列表一致。如果不需要传递参数,可以联连同()一同【省略】。
- mutable 可以取消Lambda的常量属性,因为Lambda默认是const属性;multable仅仅是让Lamdba函数体修改值传递的变量,但是修改后并不会影响外部的变量。
- ->返回类型如果是void时,可以连->一起【省略】,如果返回类型很明确,可以省略,让编译器自动推倒类型。
- 函数体和普通函数一样,除了可以使用参数之外,还可以使用捕获的变量。
[]{}
int main(int argc, char* argv[])
{
int a = , b = ;
auto total = [](int x, int y)->int {return x + y; }; //接受两个参数
cout << total(a, b)<<endl; //
auto fun1 = [=] {return a + b; }; //值传递捕捉父作用域变量
cout << fun1() << endl; //
auto fun2 = [&](int c) {b = a + c; a = ; }; //省略了返回值类型,引用捕获所有
fun2(); //1 8
cout << a <<" "<< b << endl;
a = ; b = ; //被修改后,重新赋值
auto fun3 = [=, &b](int c) mutable {b = a + c; a = ; }; //以值传递捕捉的变量,在函数体里如果要修改,要加mutaple,因为默认const修饰
fun3();
cout << a << " " <<b<< endl; //5,8
a = ; b = ; //被修改后,重新赋值
auto fun4 = [=](int x, int y) mutable->int {a += x; b += y; return a + b; };
int t = fun4(, );
cout << t << endl; //
cout << a <<" "<< b << endl; //5 7
return ;
}
块作用域以外的Lambda函数捕捉列表必须为空,因此这样的函数除了语法上的不同,和普通函数区别不大。


Lambda函数与仿函数的关系
class Price
{
private:
float _rate;
public:
Price(float rate):_rate(rate){}
float operator()(float price)
{
return price*( - _rate / );
}
}; int main(int argc, char* argv[])
{
float rate=5.5f; Price c1(rate);
auto c2 = [rate](float price)->float {return price*( - rate / ); }; float p1 = c1(); //仿函数
float p2 = c2(); //Lambda函数 return ;
}
Lambda与static inline函数
关于值传递捕捉和mutable
int main(int argc, char* argv[])
{
int j = ;
auto by_val = [=] {return j + ; };
auto by_ref = [&] {return j + ; };
cout << by_val() << endl; //
cout << by_ref() << endl; //
j++;
cout << by_val() << endl; //
cout << by_ref() << endl; //
return ;
}
class const_val_lambda
{
public:
const_val_lambda(int v):val(v){}
public:
void operator()()const { val = ; } //报错
private:
int val;
};
Lambda函数与函数指针
int main(int argc, char* argv[])
{
int a = , b = ; auto total = [](int x, int y)->int {return x + y; };
typedef int(*all)(int x, int y);
typedef int(*one)(int x); all p;
p = total;
one q;
q = total; //报错,参数不一致 decltype(total) all_1 = total;
decltype(total) all_2 = p; //报错,指针无法转换为Lambda return ;
}
Lambda与STL
C++11 Lambda函数的更多相关文章
- C++11—lambda函数
[1]lambda表达式语法定义 lambda表达式的语法定义如下: [capture] (parameters) mutable ->return-type {statement}; (1) ...
- C++11 lambda函数符
#include<iostream> #include<vector> #include<algorithm> #include<cmath> #inc ...
- C++11新特性:Lambda函数(匿名函数)
声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 ...
- 【C++11】新特性——Lambda函数
本篇文章由:http://www.sollyu.com/c11-new-lambda-function/ 文章列表 本文章为系列文章 [C++11]新特性--auto的使用 http://www.so ...
- 初窥c++11:lambda函数及其用法
转载于:点击打开链接 为什么需要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求 ...
- C++11 Lambda表达式(匿名函数)
http://www.cnblogs.com/RainyBear/p/5733399.html http://blog.163.com/lvan100@yeah/blog/static/6811721 ...
- python lambda函数详细解析(面试经常遇到)
1 作用:通常是用来在python中创建匿名函数的 2 格式: lambda 参数[,参数] : 表达式 3 注意: (1)lambda定义的是单行函数, 如果需要复杂的函数,应该定义普通函数 (2) ...
- python之Lambda函数---笔记
<Python3 程序开发指南> Lambda函数,是一个匿名函数,创建语法: lambda parameters:express parameters:可选,如果提供,通常是逗号分隔的变 ...
- C++11 lambda 表达式
C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...
随机推荐
- many connection errors,更改max_connection_errors的值
https://www.cnblogs.com/tonyccc/p/11496101.html https://blog.csdn.net/li_li_lin/article/details/7276 ...
- winform DataGrid排序、去掉第一的空白列
排序: dataGridView1.Sort(dataGridView1.Columns[3], ListSortDirection.Descending); 去掉空白列: dataGridView1 ...
- Selenium3+python自动化009- 多选框
多选框 # 随机选择多选框# sports=driver.find_elements_by_name("sport")# maxnum=len(sports)# num=rando ...
- C++——继承与派生
1.类的继承与派生 保持已有类的特性而构造新类的过程成为继承: 在已有类的基础上新增自己的特性而产生新类的过程称为派生: 被继承的已有类为基类:派生出的新类成为派生类.继承和派生其实是一回事. 继承 ...
- linux - 查看是否安装 apache 以及 apache 版本
命令 apachectl -v httpd -v 备注:这两个命令的作用一样 结果
- Xshell 5
Xshell 5安装步骤(带安装包):http://www.cnblogs.com/ysocean/p/7702243.html
- 如何把U盘的两个盘或者多个盘合成一个
1.插入U盘,导出所有重要数据. 2.右击我的电脑,点管理打开设备管理器. 3.在设备管理器里找到磁盘管理. 4.在磁盘管理右侧出现下图: 5.如图是windows 7的界面. 6.找到U盘,图上是磁 ...
- python接口自动化之发送get(三)
1.安装requests requests是python的第三方库,需要进行安装.安装之前最好先关闭fiddler cmd(win+R快捷键)输入:pip install requests 其他命令: ...
- 采用PHP实现”服务器推”技术的聊天室
传统的B/S结构的应用程序,都是采用”客户端拉”结束来实现客户端和服务器端的数据交换. 本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱动化设计),来实 ...
- WPF 解决无边框产生的相关问题
原文:WPF 解决无边框产生的相关问题 最大化: 在设置WindowStyle="None" AllowsTransparency="True"后,最大化会覆盖 ...