c++11标准中的lambda

在c++11标准中定义了一种新的可调用对象 lambda

lambda类似与匿名函数 , 只不过可以通过一种机制(不是参数)来调用一些局部变量 , 这样就能使自身的参数变少,也就能达到STL中某些算法对谓词的要求。

lambda的形式:

  1. lambda表达式的引入标志,在‘[]’里面可以填入变量,表示lambda要捕获的变量 , 这就是lambda的关键处 。  可以为空
  2. lambda表达式的参数列表 , 可以没有参数
  3. Mutable 标识 , 在某种情况下才需要
  4. 异常标识
  5. 返回类型
  6. “函数”体,也就是lambda表达式需要进行的实际操作

简单的lambda例子:

<span style="font-size:14px;">int a = 2 , b = 3;
    auto c = [](int x , int y)->int { return x+y;};  //传递了两个整形的形参
    cout<<c(a,b)<<endl;</span>
<span style="font-size:14px;">    int a = 2 , b = 3;
    auto c = [a,b]()->int { return a+b;};//捕获了两个局部变量 a 和 b</span>

这两个例子是形参和lambda捕获。

1、在lambda中的捕获可以分为值捕获和地址捕获 , 和在函数中的传值、传地址是一样的。

在变量前面加上& , 就表示传地址 , +就表示传值(默认就是传值)

<span style="font-size:14px;">    int a = 2 , b = 3;
    auto c = [&a,&]()->int { return a+b;};</span>

捕获还分了隐式和显示捕获

我们前面的捕获都是显示捕获 , 隐式捕获就是指:把所有的局部变量,都以一种方式进行捕获。

全部以引用(地址捕获)的方式进行捕获:

<span style="font-size:14px;">    int a = 2 , b = 3;
    auto c = [&]()->int { return a+b;};</span>

如果当中有某个变量不能用引用的方式捕获 , 可以这样

<span style="font-size:14px;">    int a = 2 , b = 3;
    auto c = [&,+a]()->int { return a+b;};</span>

2、值传递时的可变lambda

当我们需要改变把传入到lambda中值时 , 我们就需要加入mutable , 表示这是一个可变的lambda

<span style="font-size:14px;">    int a = 2 ;
    auto c = [a]()mutable->int { return a++;};
    cout<<c()<<endl;</span>

如果是引用传递 , lambda能不能改变 , 取决于 , 引用的变量是不是const。

3、lambda在STL算法中的运用 , 在sort中的运用

<span style="font-size:14px;">#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct node
{
    int value;
}b[10];

int main()
{
    int i ;
    for(i = 5; i >= 1; i--)
    {
        b[5-i].value = i;
    }
    sort(b , b+5 , [](struct node x , struct node y)->bool {return x.value < y.value;});
    for(i = 0; i < 5; i++)
        cout<<b[i].value<<endl;
    return 0;
}
</span>

c++11标准中的lambda

时间: 2024-07-29 18:12:35

c++11标准中的lambda的相关文章

C++11标准中常用到的各种算法汇总.

在C++11标准中定义了很多算法,这些算法可以让我们很方便的操作各种容器和数组,这里要注意一下,这些算法操作的并非容器,而是迭代器,然后通过迭代器来操作容器中的数据,算法本身并不会关注容器中保存的数据的类型. 以下是我对常识的算法的总结,这些算法大部分都在algorithm.h中,还有一些在numeric.h中. 这里我们的容器都用这几个: vector<string> vec; vector<int> vec1; vec<string> vec2; 1.find();

C++11中的Lambda表达式

本文地址:http://www.cnblogs.com/archimedes/p/c11-lambda.html,转载请注明源地址. “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如

C++11标准之右值引用(rvalue reference)

1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision.RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝.下面简单地介绍一下Copy Elision.RVO,对此不感兴趣的可以直接跳过: (1) Copy Elision Copy Elision技术是为了防止某些不必要的临时对象产生和拷贝,例如: struct A { A(int)

新标准中set的迭代器it有const修饰符,如何去掉

新的C++11标准中,set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了.但是有时候遇到要修改stl set元素的问题,这个问题一般的解决方法是先erase这个元素,然后再insert.如果利用const_cast(*it)把it映射成一个引用的对象,那么就可以对它进行修改了.const_cast<node*>(&(*it))->b = 10;

介绍C++11标准的变长参数模板

目前大部分主流编译器的最新版本均支持了C++11标准(官方名为ISO/IEC14882:2011)大部分的语法特性,其中比较难理解的新语法特性可能要属变长参数模板(variadic template)了.下面先介绍一下这个语法特性在C++11标准中的描述. 14.5.3 变长参数模板(Variadic templates) 1.一个模板形参包(template parameter pack)是一个接受零个或多个模板实参的模板形参.[例: template<class ... Types> st

在codeblocks中使用C++11标准

刚刚在codeblocks中调试一个程序,发现默认并不支持C++11标准,因此有了报错. 其实解决方法很简单. 在你的当前工程,或者新建了工程后,选择选项卡中的"Setting",然后选择"Compiler". 如下图勾选上即可--

IOS中的Block与C++11中的lambda

ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简介过,现在说下ios中的block Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),ret

c++11 新特性之lambda表达式

写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input parameters) => {statement;} c++:[capture list](parameter list) -> return type {statement;} c++lambda表达式共分为4各部分.其中parameter list 和 return type 是可以在特定情况下省略的. 一

python中的lambda表达

C++中的lambda表达式与C++11加入标准库,是一个简短的匿名的可调用对象,编译器会将其转化为一个匿名类的对象.lambda表达式的最大特点就是简短灵活,调用方便.它不需要处理很复杂的逻辑,通常只包含一两句简短的代码. python作为一种优雅简洁的脚本语言自然不会错过这种机制.python中的lambda表达式形式如下: lambda 参数列表 : 表达式 如果没有需要传递的参数,参数类表可以为空了,但表达式部分不能为空,因为lambda表达式必须有返回值. lambda表达式会返回一个