C++——Lambda表达式
0.使用场景---只有一两个地方使用的简单操作
独立出来一个函数,但这个函数实现相对简单并且可能在整个项目只使用了一次(即不存在复用的情况),那么这个时候我们就可以考虑使用下lambda表达式了。
?既然只使用一次,那直接写全代码不久醒了,为啥要函数呢?——因为lambda可以捕获局部变量
bool check_size(const string &s, string::size_type sz)
{
return s.size() >= sz;
}
//wc:第一个满足size>sz的元素
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.传统方法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; bool compare(int& a, int& b)
{
return a > b;
} int main(void)
{
int data[] = { , , , , , };
vector<int> testdata;
testdata.insert(testdata.begin(), data, data + );
// 排序算法
sort(testdata.begin(), testdata.end(), compare); // 升序 return ;
}
/*******************************************/
//2.lambda表达式
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; int main(void)
{
int data[] = { , , , , , };
vector<int> testdata;
testdata.insert(testdata.begin(), data, data + ); sort(testdata.begin(), testdata.end(), [](int a, int b){ return a > b; }); return ;
}
0.2 auto 和function 接受lambda表达式的返回
#include <iostream>
#include <functional>
using namespace std; int main(void)
{
int x = , y = ;
auto add = [](int a, int b) { return a + b; };
std::function<int(int, int)> Add = [=](int a, int b) { return a + b; }; cout << "add: " << add(x, y) << endl;//17
cout << "Add: " << Add(x, y) << endl;//17 return ;
}
0.3 使用lambda表达式来实现递归算法
#include <iostream>
#include <functional>
using namespace std; int main(void)
{
std::function<int(int)> recursion = [&recursion](int n) {
return n < ? : recursion(n - ) + recursion(n - );
}; // 我们来检测下我们的结果
cout << "recursion(2):" << recursion() << endl;//2
cout << "recursion(3):" << recursion() << endl;//3
cout << "recursion(4):" << recursion() << endl;//5 return ;
}
1.本质:未命名的内联函数
[capture list] (parameter list) ->return type
{
function body
}
//capture list 捕获列表,函数中定义的局部变量列表,通常为空
//lambda表达式必须使用尾置返回——return **
2.可以忽略返回类型,参数列表,但必须包含捕获列表和函数体
auto f =[] {return ;}
3.捕获列表
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;否则报错,应指定返回类型
//正确,单一return语句
transform(vi.begin(),vi.end(),vi.begin(), [] (int i) {
return i<? -i; i;}); //错误。不能推断返回类型
transform(vi.begin(),vi.end(),vi.begin(), [] (int i) {
if (I<) return -i;
else return i;}) //正确,尾置返回类型
transform(vi.begin(),vi.end(),vi.begin(), [] (int i) ->int
{ if (I<) return -i;
else return i;})
6.bind()
7.using std::placeholders::_1;
8.示例
stable_sort(words.begin(), words.end(), [](const string& a, const string& b)
{ return a.size()<b.size();});
class ShorterString{
public:
bool opereator()(const string &s1,const string &s2) const
{return s1.size()<s2.size();}
};
stable_sort(words.begin(), words.end(), ShorterString{));
auto wc = find_if(words.begin(), words.end(), [sz] (const string& a)
{ return a.size()>=sz;});//返回第一个指向满足条件元素的迭代器
class SizeComp{
SizeComp(size_t n):sz(n) { }
bool operator()(const string &s) const
{ return s.size()>=sz;}
private:
size_t sz;
};
auto wc = find_if(words.begin(), words.end(),SizeComp(sz));
C++——Lambda表达式的更多相关文章
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- 背后的故事之 - 快乐的Lambda表达式(二)
快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Lambda 表达式递归用法实例
注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...
- Spark中Lambda表达式的变量作用域
通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...
- 释放Android的函数式能量(I):Kotlin语言的Lambda表达式
原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...
随机推荐
- shell从字符串中提取子串(正则表达式)
通过试验,可以通过grep.sed两种方式实现. 假设需要提取libgcc-4.8.5-4.h5.x86_64.rpm中的版本号. grep echo "libgcc-4.8.5-4.h5. ...
- CJE-Jenkins认证工程师备考指南1-考试简介
CloudBees公司提供两项认证 Jenkins工程师(CJE)考试 包括60个选择题 测试开源Jenkins的知识. CloudBees 平台工程师(CCJE)考试 包含90个问题: 60个问题测 ...
- main()和代码块
main方法 * main()方法的使用说明 * main方法是程序的主入口(一个主程序 先从main开始进行执行) * * * main方法也可以是一个普通的静态方法 代码块 代码块也是类的成员变量 ...
- flex属性flex-grow、flex-shrink、flex-basis
tip: 1)这些属性写在子元素中,作用于子元素(父元素中应设置display:flex) 2)作用是子元素如何分配父元素的空间 3) flex-grow 是扩展比率,当子元素宽度总和小于父元素宽度时 ...
- 前端学习笔记——HTML
1.前端的三把利器 HTML:我们把它比喻成赤裸的一个人 CSS:华丽的衣服 JS/JavaScript:赋予这个人的行为,也就是动起来 2.什么是HTML? HTML 是用来描述网页的一种语言.ht ...
- WPF常规表单验证
1:ViewModel 实现验证接口 IDataErrorInfo 2:实现接口的相关验证逻辑,并把错误信息反馈给 Error public string this[string columnName ...
- js的内部特性--属性
使用方法:通过调用Object.defineProperty(对象,"对象属性",{}进行的操作}) 当对一个对象的属性的属性类型中vlue设置为一个值时,则这个对象的这个属性的值 ...
- MySQL数据库学习初步
我使用的环境是Win7,开始学习PHP和MySQL,并且买了本<Head First PHP & MySQL>,可以从Head First Labs官网获得HeadFirst系列书 ...
- Java 13 即将发布,新特性必须抢先看!
作者:h4cd 本文转载自开源中国(ID:oschina2013) 由于 Java 现在采取"半年发布一次新版本"的模式,所以 Java 12 的下一个版本 Java 13/JDK ...
- 在不打开excel的情况下用python执行excel
import win32com.client import time path = r'absolute dir' #比如填文件的绝对路径,比如d:/file/stock.xlsx xl = win3 ...