服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++实例详解lambda表达式的使用

C++实例详解lambda表达式的使用

2022-11-21 15:27liufeng2023 C/C++

Lambda表达式是现代C++在C ++ 11和更高版本中的一个新的语法糖 ,在C++11、C++14、C++17和C++20中Lambda表达的内容还在不断更新。 lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法

lambda表达式

  • C++11 函数对象的升级版 =》 lambda表达式
  • 函数对象的缺点:(需要定义一个类)
  • 函数对象使用在 泛型算法参数传递 比较性质/自定义操作 优先级队列 智能指针(自定义智能指针的删除器)

lambda表达式原理: 就是函数对象更高级的实现!

1、lambda表达式语法

C++实例详解lambda表达式的使用

例1:

lambda表达式对应函数对象小括号重载函数的。

C++实例详解lambda表达式的使用

  • []为空,相当于构造函数不接收任何外部传进来的变量。
  • ()是运算符重载函数,具体接收的参数的个数
  • 然后是返回值,看是无类型还是其他类型。
  • 最后是函数代码

C++实例详解lambda表达式的使用

C++实例详解lambda表达式的使用

[]不为空,相当于构造函数接收任何外部传进来的变量a,b。

例2:

C++实例详解lambda表达式的使用

C++实例详解lambda表达式的使用

C++实例详解lambda表达式的使用

如果lambda表达式的返回值不需要,那么"->返回值"可以省略的

C++实例详解lambda表达式的使用

[捕获外部变量]

[]:表示不捕获任何外部变量
[=]:以传值的方式捕获外部的所有变量
[&]:以传引用的方式捕获外部的所有变量
[this]:捕获外部的this指针
[=,&a]:以传值的方式捕获外部的所有变量,但是a变量以传引用的方式捕获
[a, b]:以值传递的方式捕获外部变量a和b
[a, &b]:a以值传递捕获,b以传引用的方式捕获

值传递:

加上mutable,表示将值传递的形参a,b改掉;不影响外部的实参。

C++实例详解lambda表达式的使用

引用传递:

修改的是实参,不需要加mutable

C++实例详解lambda表达式的使用

2、lambda应用

例1—从大到小排序

C++实例详解lambda表达式的使用

C++实例详解lambda表达式的使用

例2—按序插入元素65

C++实例详解lambda表达式的使用

C++实例详解lambda表达式的使用

例3—for_each

C++实例详解lambda表达式的使用

C++实例详解lambda表达式的使用

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
	vector<int> vec;
	for (int i = 0; i < 20; i++)
	{
		vec.push_back(rand() % 100 + 1);
	}
	sort(vec.begin(), vec.end(), [](int a, int b)->bool
		{
			return a > b;
		});
	for (int val : vec)
	{
		cout << val << " ";
	}
	cout << endl;
	//65按序插入序列  要找第一个小于65的数字
	auto it = find_if(vec.begin(), vec.end(),
		[](int a)->bool {return a < 65; });
	if (it != vec.end())
	{
		vec.insert(it, 65);
	}
	for (int val : vec)
	{
		cout << val << " ";
	}
	cout << endl;
	for_each(vec.begin(), vec.end(), [](int a)
		{
			if (a % 2 == 0)
				cout << a << " ";
		});
	cout << endl;
	return 0;
}

3、lambda表达式的应用实践

既然lambda表达式只能使用在语句当中,如果想跨语句使用之前定义好的lambda表达式,怎么办?用什么类型来表示lambda表达式?

  • lambda表达式 =》 函数对象 用function类型绑定它
  • 用function类型表示函数对象的类型
  • bind绑定器绑定的结果依然还是一个函数对象;

1、计算器案例

C++实例详解lambda表达式的使用

2、智能指针案例

C++实例详解lambda表达式的使用

3、优先级队列

C++实例详解lambda表达式的使用

上面写法灵活性太差。现在优化:

C++实例详解lambda表达式的使用

priority_queue本身就有3个模板参数,分别是元素类型、容器类型、函数对象。

可以接收外部自定义的函数对象:

C++实例详解lambda表达式的使用

#include <iostream>
#include <functional>
#include <queue>
using namespace std;
class Data
{
public:
    Data(int val1 = 10, int val2 = 10) :ma(val1), mb(val2) {}
    int ma;
    int mb;
};
int main()
{
    //优先级队列
    //priority_queue<Data> queue;
    using FUNC = function<bool(Data&, Data&)>;
    priority_queue<Data, vector<Data>, FUNC>
        maxHeap([](Data& d1, Data& d2)->bool
            {
                return d1.mb > d2.mb;
            });
    maxHeap.push(Data(10, 20));
    maxHeap.push(Data(15, 15));
    maxHeap.push(Data(20, 10));
    return 0;
}

到此这篇关于C语言实例详解lambda表达式的使用的文章就介绍到这了,更多相关C语言lambda内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/Edward_LF/article/details/124531123

延伸 · 阅读

精彩推荐
  • C/C++C++按照正态分布来排列整型数组元素

    C++按照正态分布来排列整型数组元素

    这篇文章主要介绍了C++按照正态分布来排列整型数组元素的相关资料,需要的朋友可以参考下...

    C++教程网6772021-04-12
  • C/C++C++实现十进制数转换为二进制数的数学算法

    C++实现十进制数转换为二进制数的数学算法

    这篇文章和大家分享一下我个人对十进制数转换为二进制数的想法,目前暂时更新只整数十进制的转换,后续会更新带有小数的进制转换,代码使用c++实现...

    赵清诗7112022-01-06
  • C/C++C语言实现双人贪吃蛇游戏实例代码

    C语言实现双人贪吃蛇游戏实例代码

    大家好,本篇文章主要讲的是C语言实现双人贪吃蛇游戏实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    .KEG11532022-07-31
  • C/C++C++中 ‘=default ’及‘ =delete ’的使用

    C++中 ‘=default ’及‘ =delete ’的使用

    这篇文章主要介绍了C++中 =default 及 =delete 使用,使用=default和=delete可以控制编译器默认函数体的使用,下面我们就来看看具体的室友方法吧,需要的朋友也...

    龙小4362022-07-27
  • C/C++C++骑士游历问题(马踏棋盘)解析

    C++骑士游历问题(马踏棋盘)解析

    这篇文章主要为大家详细介绍了C++骑士游历问题的解答思路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    不秃头的小李同学9812022-09-23
  • C/C++C语言实现简单的三子棋项目

    C语言实现简单的三子棋项目

    这篇文章主要为大家详细介绍了C语言实现简单的三子棋项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    还小给个面子11112021-12-09
  • C/C++C++基础入门教程(八):函数指针

    C++基础入门教程(八):函数指针

    这篇文章主要介绍了C++基础入门教程(八):函数指针,本文讲解了函数原型和函数定义、const限定符与指针、函数的指针参数、为什么要使用指针参数等内...

    C++教程网11372021-02-21
  • C/C++C++实现截图截屏的示例代码

    C++实现截图截屏的示例代码

    本文主要介绍了C++实现截图截屏的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    爱看书的小沐10172022-03-09