C++ 11 Lambda表达式
C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda的语法形式如下:
[函数对象参数] (操作符重载函数参数) mutable或exception声明 ->返回值类型 {函数体}
可以看到,Lambda主要分为五个部分:[函数对象参数]、(操作符重载函数参数)、mutable或exception声明、->返回值类型、{函数体}。下面分别进行介绍。
一、[函数对象参数],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:
1、空。没有使用任何函数对象参数。
2、=。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
3、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
4、this。函数体内可以使用Lambda所在类中的成员变量。
5、a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
6、&a。将a按引用进行传递。
7、a, &b。将a按值进行传递,b按引用进行传递。
8、=,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。
9、&, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。
二、(操作符重载函数参数),标识重载的()操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递。
三、mutable或exception声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(int)。
四、->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
五、{函数体},标识函数的实现,这部分不能省略,但函数体可以为空。
下面给出了一段示例代码,用于演示上述提到的各种情况,代码中有简单的注释可作为参考。
<span xmlns="http://www.w3.org/1999/xhtml" style="">class CTest
{
public:CTest() : m_nData(20) { NULL; }void TestLambda(){vector<int> vctTemp;vctTemp.push_back(1);vctTemp.push_back(2);// 无函数对象参数,输出:1 2{for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });}// 以值方式传递作用域内所有可见的局部变量(包括this),输出:11 12{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; });}// 以引用方式传递作用域内所有可见的局部变量(包括this),输出:11 13 12{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; });cout << a << endl;}// 以值方式传递局部变量a,输出:11 13 10{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; });cout << a << endl;}// 以引用方式传递局部变量a,输出:11 13 12{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; });cout << a << endl;}// 传递this,输出:21 22{for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; });}// 除b按引用传递外,其他均按值传递,输出:11 12 17{int a = 10;int b = 15;for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; });cout << b << endl;}// 操作符重载函数参数按引用传递,输出:2 3{for_each(vctTemp.begin(), vctTemp.end(), [](int &v){ v++; });for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });}// 空的Lambda表达式{[](){}();[]{}();}}private:int m_nData;
};</span>
C++ 11 Lambda表达式相关推荐
- C++11:Lambda表达式(匿名函数)理解
C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...
- C++11 Lambda表达式(匿名函数)详解
使用 STL 时,往往会大量用到函数对象,为此要编写很多函数对象类.有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费. 而且,定义函数对象类的地方和使用函 ...
- C++11 lambda表达式、function类模板、bind函数适配器
文章目录 lambda表达式 lambda表达式的语法 lambda表达式的原理 function模板 function与重载函数 bind函数适配器 lambda表达式 当我们在写代码的时候如果经常 ...
- [C++11]lambda表达式语法
代码如下: #include <iostream> using namespace std;void func(int x, int y) {int a;int b;[=]() {int ...
- C++11 Lambda表达式
1.简介 1.1定义 C++11新增了很多特性,Lambda表达式(Lambda expression)就是其中之一,很多语言都提供了 Lambda 表达式,如 Python,Java ,C#等.本质 ...
- C++11 lambda表达式与函数对象
C++ lambda表达式与函数对象 lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读.但是从本质上来讲, ...
- C++11——lambda表达式
目录 前言 一.lambda表达式用法 二.lambda表达式语法 三.lambda表达式的原理 前言 在显示生活中,我们在用手机购物时.总是可以在页面上看到下面这样的选项. 我们知道底层这是通过排序 ...
- 1.11 Lambda表达式遍历Iterator迭代器
Java使用Lambda表达式遍历Iterator迭代器 Java 8 为 Iterator 引入了一个 forEachRemaining(Consumer action) 默认方法,该方法所需的 C ...
- vector 使用 c++11 Lambda 表达式 排序
struct SIndexDataNew {1 optional short shtMarket;2 optional string sCode;3 optional int iDate;4 opti ...
最新文章
- 关于Kanas.Net框架的一些背景
- 【杂谈】如何使用有三AI生态学习计算机视觉和自然语言处理等内容
- 自建SE16N功能,修改数据库表数据
- Java ThreadLocal 使用详解
- [CSS]BlendTrans滤镜
- 虚拟机安装Solaris10
- 在ABAP XSLT中调用ABAP类的方法
- 计算机语言学 自然语言处理程序,利用知网进行(计算机)自然语言处理
- python ftplib_python:使用ftplib编写FTP客户端
- android窗口动画体系,Android 7.1 GUI系统-窗口管理WMS-动画的执行(七)
- arp协议属于哪一层_TCP/IP协议栈-之-ARP协议分析
- Tomcat执行start文件后有乱码
- POJ 1469 COURSES 二分图最大匹配
- SQL PASS西雅图之行——University of Washington篇
- 啊哈C语言——让计算机多彩的开口说话
- 【OS】单道程序设计VS多道程序设计
- 数学建模优化模型简单例题_简单数学建模100例
- 人事管理系统实现(一)
- # Classification: Accuracy(准确率)
- solr的DIH操作同步mysql数据