​​C++11系列学习之Lambda表达式

 更新时间:2022年04月25日 10:20:38   作者:小杰编程  
这篇文章主要介绍了​​C++11系列学习之Lambda表达式,C++11终于也引入了lambda表达式,lambda最早来源于函数式编程,现代语言慢慢都引入了这个语法,下文关于​​C++11Lambda表达式相关内容需要的小伙伴可以参考一下

前言:

终于在C++11中引入了lambda表达式,lambda最早来源于函数式编程,现代语言慢慢都引入了这个语法,C++也不甘落后,在新标准中加入了lambda表达式。

一、为什么要有lambda表达式?

  • 使用方便,就地声明函数或函数对象,尤其是和bind配合食用更佳
  • 简洁,可以匿名创建,语法看起来极其舒适
  • 可以实现功能闭包,使用起来更加灵活

二、使用语法

lambda的通用语法:[ 捕获列表] ( 参数表 ) 函数选项 -> 返回值类型 { 函数体 ;};

捕获列表

  • [] 不捕获任何变量
  • [&] 以引用方式捕获外部作用域中所有变量
  • [=] 以值的方式捕获外部作用域中的所有变量
  • [= , &x] 以值方式捕获外部作用域变量,但是以引用方式捕获x变量
  • [ x ] 按值方式捕获 x 变量
  • [ this ] 捕获当前类的this指针,那么lambda表达式拥有了和类成员函数同样的权限,如果使用了& 或 = 那么默认添加了此项

mutable影响lambda表达式

被mutable 修饰的lambda表达式就算没有参数也要写明参数列表,若没有加mutable,lambda不能修改这个变量的值,只能使用。 但是被修饰后的lambda表达式,会像函数传递参数一样,在内部定义一个变量并拷贝这个值。

#include <iostream>

using namespace std;

int main()
{
size_t t = 9;
auto f = [t] () mutable {return ++t; };
cout << f() << endl; //10
cout << f() << endl; //11
cout << "t:" << t << endl; //9
return 0;
}

可以把它视为带有重载括号运算符的仿函数,并且没有捕获任何变量的lambda表达式可以被转换成一个普通的函数指针

//用std::function来存储和操作lambda表达式
std::function<int, int> f1 = [](int a){ return a};

//转换为一个普通的函数指针
using fun = int(*){int};
fun f =[](int a){return a;}

f(1)

std::bind和lambda表达式结合

//eg : 用来集合中计算大于5小于10的元素的个数
auto f = std::(std::logical_and<bool>(), std::bind( std::greater<int>(), _1, 5), std::bind(std::lesss<int>(),_1, 10));

int count = std::count::_if(coll.bengin(), coll.end(),f);

三、std::function 和lambda表达式选择

lambdastd::function效果是一样的,但是更加简洁一些,但不能完全代替,因为一些老的库不支持lambda表达式

到此这篇关于​​C++11系列学习之Lambda表达式的文章就介绍到这了,更多相关​​C++11Lambda表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Boost weak_ptr智能指针超详细讲解

    C++ Boost weak_ptr智能指针超详细讲解

    智能指针是一种像指针的C++对象,但它能够在对象不使用的时候自己销毁掉。虽然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷贝和赋值操作),因此很少有人使用。它是Boost各组件中,应用最为广泛的一个
    2022-11-11
  • C++ socket通信遇到的问题及解决方法

    C++ socket通信遇到的问题及解决方法

    这篇文章主要介绍了C++ socket通信遇到的问题,通过代码修改来解决这个问题,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • C语言实现三子棋实例代码

    C语言实现三子棋实例代码

    大家好,本篇文章主要讲的是C语言实现三子棋实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • 浅谈C++流库的基本结构

    浅谈C++流库的基本结构

    本文主要介绍了浅谈C++流库的基本结构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C++ vector容器缩小capacity问题

    C++ vector容器缩小capacity问题

    这篇文章主要介绍了C++ vector容器缩小capacity问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言入门篇--变量的左值和右值

    C语言入门篇--变量的左值和右值

    本篇文章是基础篇,适合c语言刚入门的朋友,本文对初识c语言的指针和指针变量做了简单的分析,帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • 枚举窗口句柄后关闭所有窗口示例

    枚举窗口句柄后关闭所有窗口示例

    这篇文章主要介绍了关闭所有窗口的方法,原理是枚举所有窗口句柄,然后发送WM_CLOSE消息来关闭窗口,需要的朋友可以参考下
    2014-01-01
  • C语言用栈实现十进制转换为二进制的方法示例

    C语言用栈实现十进制转换为二进制的方法示例

    这篇文章主要介绍了C语言用栈实现十进制转换为二进制的方法,结合实例形式分析了C语言栈的定义及进制转换使用技巧,需要的朋友可以参考下
    2017-06-06
  • C语言如何建立链表并实现增删查改详解

    C语言如何建立链表并实现增删查改详解

    这篇文章主要给大家介绍了关于C语言如何建立链表并实现增删查改的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 深入学习C++智能指针之shared_ptr与右值引用的方法

    深入学习C++智能指针之shared_ptr与右值引用的方法

    智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存,今天通过本文给大家分享C++智能指针之shared_ptr与右值引用的方法,需要的朋友跟随小编一起看看吧
    2021-07-07

最新评论