0.使用场景---只有一两个地方使用的简单操作

独立出来一个函数,但这个函数实现相对简单并且可能在整个项目只使用了一次(即不存在复用的情况),那么这个时候我们就可以考虑使用下lambda表达式了。

?既然只使用一次,那直接写全代码不久醒了,为啥要函数呢?——因为lambda可以捕获局部变量

  1. bool check_size(const string &s, string::size_type sz)
  2. {
  3. return s.size() >= sz;
  4. }

  5. //wc:第一个满足size>sz的元素
  6. auto wc = find_if (words.begin(),words.end(),[sz](const string &a) {return a.size()>=sz;});

函数check_size()无法作为find_if的参数。而且需要考虑如何

参考:https://blog.csdn.net/qq_34199383/article/details/80469780

0.1 比较大小

  1. //1.传统方法
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. bool compare(int& a, int& b)
  8. {
  9. return a > b;
  10. }
  11.  
  12. int main(void)
  13. {
  14. int data[] = { , , , , , };
  15. vector<int> testdata;
  16. testdata.insert(testdata.begin(), data, data + );
  17. // 排序算法
  18. sort(testdata.begin(), testdata.end(), compare); // 升序
  19.  
  20. return ;
  21. }
  22. /*******************************************/
  23. //2.lambda表达式
  24. #include <iostream>
  25. #include <vector>
  26. #include <algorithm>
  27. using namespace std;
  28.  
  29. int main(void)
  30. {
  31. int data[] = { , , , , , };
  32. vector<int> testdata;
  33. testdata.insert(testdata.begin(), data, data + );
  34.  
  35. sort(testdata.begin(), testdata.end(), [](int a, int b){ return a > b; });
  36.  
  37. return ;
  38. }

0.2 auto 和function 接受lambda表达式的返回

  1. #include <iostream>
  2. #include <functional>
  3. using namespace std;
  4.  
  5. int main(void)
  6. {
  7. int x = , y = ;
  8. auto add = [](int a, int b) { return a + b; };
  9. std::function<int(int, int)> Add = [=](int a, int b) { return a + b; };
  10.  
  11. cout << "add: " << add(x, y) << endl;//17
  12. cout << "Add: " << Add(x, y) << endl;//17
  13.  
  14. return ;
  15. }

0.3 使用lambda表达式来实现递归算法

  1. #include <iostream>
  2. #include <functional>
  3. using namespace std;
  4.  
  5. int main(void)
  6. {
  7. std::function<int(int)> recursion = [&recursion](int n) {
  8. return n < ? : recursion(n - ) + recursion(n - );
  9. };
  10.  
  11. // 我们来检测下我们的结果
  12. cout << "recursion(2):" << recursion() << endl;//2
  13. cout << "recursion(3):" << recursion() << endl;//3
  14. cout << "recursion(4):" << recursion() << endl;//5
  15.  
  16. return ;
  17. }

1.本质:未命名的内联函数

  1. [capture list] (parameter list) ->return type
  2. {
  3. function body
  4. }
  5. //capture list 捕获列表,函数中定义的局部变量列表,通常为空
  6. //lambda表达式必须使用尾置返回——return **

2.可以忽略返回类型,参数列表,但必须包含捕获列表和函数体

  1. auto f =[] {return ;}

3.捕获列表

  1. auto wc = find_if(words.begin(), words.end(),[sz](const string &a) { return a.size() >= sz;} );

4.变量截取的方式

  • [] 不截取任何变量
  • [&] 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
  • [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

5.lambda表达式产生的类不含有默认构造函数、赋值运算符、默认析构函数;

6.lambda表达式是一种简易的定义函数对象类的方式。??如何定义?有何用处?

l参考:

https://www.cnblogs.com/smiler/p/4095723.html

5.返回类型:单一的return语句;多语句则默认返回void;否则报错,应指定返回类型

  1. //正确,单一return语句
  2. transform(vi.begin(),vi.end(),vi.begin(), [] (int i) {
  3. return i<? -i; i;});
  4.  
  5. //错误。不能推断返回类型
  6. transform(vi.begin(),vi.end(),vi.begin(), [] (int i) {
  7. if (I<) return -i;
  8. else return i;})
  9.  
  10. //正确,尾置返回类型
  11. transform(vi.begin(),vi.end(),vi.begin(), [] (int i) ->int
  12. { if (I<) return -i;
  13. else return i;})

6.bind()

7.using std::placeholders::_1;

8.示例

  1. stable_sort(words.begin(), words.end(), [](const string& a, const string& b)
  2. { return a.size()<b.size();});
  1. class ShorterString{
  2. public:
  3. bool opereator()(const string &s1,const string &s2) const
  4. {return s1.size()<s2.size();}
  5. };
  1. stable_sort(words.begin(), words.end(), ShorterString{));
  1. auto wc = find_if(words.begin(), words.end(), [sz] (const string& a)
  2. { return a.size()>=sz;});//返回第一个指向满足条件元素的迭代器
  1. class SizeComp{
  2. SizeComp(size_t n):sz(n) { }
  3. bool operator()(const string &s) const
  4. { return s.size()>=sz;}
  5. private:
  6. size_t sz;
  7. };
  8.  
  9. auto wc = find_if(words.begin(), words.end(),SizeComp(sz));
  1.  

C++——Lambda表达式的更多相关文章

  1. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  2. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  3. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  4. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  5. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  6. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  7. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. Lambda 表达式递归用法实例

    注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...

  9. Spark中Lambda表达式的变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...

  10. 释放Android的函数式能量(I):Kotlin语言的Lambda表达式

    原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...

随机推荐

  1. sparql学习sparql示例、dbpedia在线验证

    sparql学习sparql示例.dbpedia在线验证 导言 作为sparql群的群主,自己也不太懂sparql,竟然意外接到了一份作业.好久没有接活了.主要就是复习了一下各个语言怎么写.记录一下, ...

  2. springboot bootstrap.yml 和 application.yml

    bootstrap.yml可以理解成系统级别的一些参数配置,这些参数一般是不会变动的 application.yml 可以用来定义应用级别的,如果搭配spring-cloud-config使用 app ...

  3. Django 模型中的CRUD

    一.通过 ORM 向 DB 中增加数据 1.Entry.objects.create(属性=值,属性=值) Entry:具体要操作的Model类 ex: Author.objects.create(n ...

  4. docker x509: certificate has expired or is not yet valid

    系统环境:centos 6.5 内核版本:2.6.32-696.1.1.el6.x86_64 程序版本:Docker version 1.7.1, build 786b29d/1.7.1 问题:下载镜 ...

  5. 常用命令--awk

    awk '{ BEGIN{stat1} BEGIN{stat2} pattern1{action1} pattern2{action2} ... patternn{actionn} {默认动作,无条件 ...

  6. 一份详尽的 Java 问题排查工具清单,值得收藏!

    | grep 5 -A 3    #上匹配seq 10 | grep 5 -B 3    #下匹配seq 10 | grep 5 -C 3    #上下匹配,平时用这个就妥了cat f.txt | g ...

  7. [已解决]报错: TLS handshake timeout

    为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值. { "registry-mirrors": ...

  8. SpringMVC_HandlerMethodArgumentResolver 实践

    HandlerMethodArgumentResolver  是什么? 就是用于解析参数的一个接口,springMVC(4.1)会直接调用这个接口的方法,对参数进行一定的解析.比如会在 Invocab ...

  9. Smokeping分享

    Somkeping master端搭建过程 服务端/master端 一. 搭好环境,安装依赖包(1)yum -y install httpd fping echoping curl  rrdtool ...

  10. react踩坑

    1.列表渲染一定要注意key的唯一性,不然会导致页面只更新部分的bug graphVertexConfigList.data.map((item, index) => { return < ...