当前位置: 首页 > news >正文

可调用对象和Lambda

可调用对象:
        函数

        函数指针

        函数对象

        Lambda表达式(匿名函数)

01 函数对象

如果一个类实现了"函数调用运算符()"的重载,那么这个类的对象称为函数对象(仿函数)

函数对象的行为,类似于函数,可以被调用

#include <iostream>using namespace std;// 小于对象
class Less {private:int val_;public:  Less(int v = 0):val_{v} {}// 重载函数调用运算符 ()void operator()() { // 重载了()cout << "operator()-----1" << endl;}bool operator()(int v) { // 重载了()cout << "operator()-----2" << endl;return v <= val_;}void set(int v) {val_ = v;}};int main() {Less l{20}; // l就是一个可调用对象,拥有函数的行为和特征l();cout << l(25) << endl;l.set(30);cout << l(25) << endl;return 0;
}

函数对象和普通函数相比较,函数对象有什么好处?

        可以携带附加的数据,函数对象可以拥有自己的属性和行为

主要用途:

        除了函数的基本用法

        在标准库中,有很多常用的算法(全局变量)都使用到了函数对象

        如:

                find_if:查找算法,可以在一个指定区间内查找一个符合条件的元素

                这些算法在使用的时候,都需要接受一个“一元谓词对象”(可调用对象)用来描述一个条件

#include <iostream>
#include <algorithm> // find_ifusing namespace std;// 小于对象
class Less {private:int val_;public:  Less(int v = 0):val_{v} {}// 重载函数调用运算符 ()void operator()() { // 重载了()cout << "operator()-----1" << endl;}bool operator()(int v) { // 重载了()cout << "operator()-----2" << endl;return v <= val_;}void set(int v) {val_ = v;}
};bool foo(int x) { // 有一个参数的可调用对象---->一元谓词cout << "foo" << endl;return x < 20;
}int main() {Less l{5}; // l就是一个可调用对象,拥有函数的行为和特征l();cout << l(10) << endl;cout << "===============" << endl;l.set(35);cout << l(10) << endl;cout << "===============" << endl;int arr[10] = {38, 25, 73, 58, 46, 87, 29, 16, 34, 61};// 在指定的区间内查找一个指定的值int *p = find(arr, arr + 10, 58); // 返回查找到的元素的地址,如果没找到,则返回区间末尾cout << *p << endl;// 在一个区间内,查找第一个符合条件的元素// 条件--->谓词对象(一元谓词),是使用可调用对象描述的一个条件// 返回区间内,第一个让"可调用对象"返回真的元素的"迭代器"p = find_if(arr, arr + 10, foo); // 返回区间内,第一个让foo返回真的元素,第一个小于20的元素cout << *p << endl;cout << "===============" << endl;p = find_if(arr, arr + 10, l); // 返回区间内,第一个让l返回真的元素,第一个小于35的元素cout << *p << endl;return 0;
}

02 lambda匿名函数用法详解

lambda被用来表示一种匿名函数,所谓匿名函数,简单地理解就是没有名称的函数,又常被称为lambda函数或者lambda表达式


lambda匿名函数的定义方式:

[外部变量访问方式说明符] (参数) mutable noexcept/throw() -> 返回值类型 {函数体;
}

其中各部分的含义分别为:
(1) [外部变量访问方式说明符]

[]方括号用于向编译器表明当前是一个lambda表达式,其不能被省略在方括号内部,可以注明当前lambda函数的函数体中可以使用哪些“外部变量”所谓外部变量,指的是和当前lambda表达式位于同一作用域内的所有局部变量

(2) (参数)

和普通函数的定义一样,lambda匿名函数也可以接收外部传递的多个参数和普通函数不同的是,如果不需要传递参数,可以连同()小括号一起省略

(3) mutable

此关键字可以省略,如果使用,则之前的()小括号将不能省略(参数个数可以为0)默认情况下,对于值传递方式引入的外部变量,不允许在lambda表达式内部修改它们的值(可以
理解为这部分变量都是const常量),而如果想修改它们,就必须使用mutable关键字注意:对于以值传递方式引入的外部变量,lambda表达式修改的是拷贝的那一份,并不会修改真正的外部变量

(4) noexcept / throw()

可以省略,如果使用,则之前的()小括号将不能省略(参数个数可以是0)默认情况下,lambda函数的函数体中可以抛出任何类型的异常,而标注noexcept关键字,
则表示函数体内不会抛出任何异常使用throw()可以指定lambda函数内部可以抛出的异常类型如果lambda函数标有noexcept而函数体内抛出了异常,又或者使用throw()限定了异常类型而
函数体内抛出了非指定类型的异常,这些异常无法使用try-catch捕获,会导致程序执行失败

(5) ->返回值类型

指明lambda匿名函数的返回值类型如果lambda函数体内只有一个return语句,或者该函数返回void
则编译器可以自行推断出返回值类型,此情况下可以直接省略->返回值类型

(6) 函数体

和普通函数一样,lambda匿名函数包含的内部代码都放置在函数体中该函数体内除了可以使用指定传递进来的参数以外,还可以使用指定的外部变量以及
全局范围内的所有全局变量需要注意的是,外部变量会受到以值传递还是以引用传递方式引入的影响,而全局变量则不会
换句话说,在lambda表达式内可以使用任意一个全局变量,必要时还可以直接修改它们的值





        

相关文章:

可调用对象和Lambda

可调用对象&#xff1a; 函数 函数指针 函数对象 Lambda表达式(匿名函数) 01 函数对象 如果一个类实现了"函数调用运算符()"的重载&#xff0c;那么这个类的对象称为函数对象(仿函数) 函数对象的行为&#xff0c;类似于函数&#xff0c;可以被调用 #include …...

华为认证HCIE存储考啥?未来发展方向在哪?一个月就能轻松拿下?

说起HCIE&#xff0c;很多人第一反应都是路由交换、网络安全那些“热门”方向&#xff0c;而存储方向反而成了小众的存在。 其实&#xff0c;存储的江湖地位一点不低&#xff0c;尤其在数据爆炸的时代。 今天咱们就聊聊HCIE存储考什么、为什么要学&#xff0c;以及未来的可能…...

如何让自己的网站,被更多的人搜索到(免费方案)

文章目录 一、要做时间的朋友二、需要独立IP的服务器三、SEO信息如何设置设置网站TDK生成网站地图设置搜索引擎自动提交部署SSL证书加分项&#xff1a;定期更新文章 引言&#xff1a; 许多人都有这样一个问题&#xff1a;做好自己的网站&#xff0c;如何让这个网站被更多的人浏…...

Modbus 协议:工业自动化领域的通信脊梁

一、引言 在当今工业自动化的舞台上&#xff0c;数据的准确传输和设备间的有效通信是实现高效生产、精准控制的关键。Modbus 协议作为一种应用广泛、历史悠久的通信协议&#xff0c;在工业领域发挥着举足轻重的作用。从工厂的生产线到智能建筑的控制系统&#xff0c;从能源管理…...

函数的力量:掌握C语言的基石

目录 前言 标准库&#xff1a;C语言的百宝箱 头文件&#xff1a;库函数的藏宝图 实例分析&#xff1a;计算平方根的sqrt函数 功能描述 头文件包含的重要性 库函数文档的一般格式 自定义函数&#xff1a;释放你的编程创造力 函数的语法形式 函数的比喻 函数的举例 简化…...

U-Boot的移植流程

U-Boot的简化版启动流程&#xff1a; 1、设置状态寄存器 cpsr &#xff0c;使CPU进入 SVC 特权模式&#xff0c;并且禁止 FIQ 和 IRQ&#xff1b; 2、关闭看门狗、中断、MMU、Cache&#xff1b; 3、初始化部分寄存器和外设&#xff08;时钟、串口、Flash、内存&#xff09;&…...

xRDP – 在 Ubuntu 18.04、20.04、22.04、22.10、23.04(脚本版本 1.4.7)上轻松安装 xRDP

最新脚本Repository | c-nergy.be 概述 到目前为止&#xff0c;您应该知道 xrdp-installer 脚本旨在简化 xRDP 在 Ubuntu 操作系统上的安装和配置后操作。xRDP 是一款在 Linux 上启用远程桌面服务的软件。这意味着 Windows 用户可以使用他们的远程桌面客户端 &#xff08;mst…...

[Linux网络编程]04-多进程/多线程并发服务器思路分析及实现(进程,信号,socket,线程...)

一.思路 实现一个服务器可以连接多个客户端&#xff0c;每当accept函数等待到客户端进行连接时 就创建一个子进程; 核心思路&#xff1a;让accept循环阻塞等待客户端&#xff0c;每当有客户端连接时就fork子进程&#xff0c;让子进程去和客户端进行通信&#xff0c;父进程用于…...

《OpenCV计算机视觉》—— 年龄与性别预测

结合以下链接中的文章有助于理解此篇案例&#xff1a; OpenCV中的 cnn 模块 https://blog.csdn.net/weixin_73504499/article/details/142965441?spm1001.2014.3001.5501 此案例是通过使用OpenCV中的cnn模块来调用别人已经训练好的深度学习模型&#xff0c;此篇案例中用到了…...

详解23种设计模式——第一部分:概述+创建型模式

目录 1. 概述 2. 创建型模式 2.1 简单&#xff08;静态&#xff09;工厂模式 2.1.1 介绍 2.1.2 实现 2.2 工厂模式 2.3 抽象工厂模式 2.4 单例模式 2.4.1 饿汉模式 2.4.2 懒汉模式 2.4.3 线程安全的懒汉式 2.4.4 DCL单例 - 高性能的懒汉式 2.5 建造者模式 2.6 原…...

semi-Naive Bayesian(半朴素贝叶斯)

semi-Naive Bayesian&#xff08;半朴素贝叶斯&#xff09; 引言 朴素贝叶斯算法是基于特征是相互独立这个假设开展的&#xff08;为了降低贝叶斯公式: P ( c ∣ x ) P ( c ) P ( x ∣ c ) P ( x ) P(c|x) \frac {P(c)P(x|c)}{P(x)} P(c∣x)P(x)P(c)P(x∣c)​中后验概率 P …...

大语言模型(LLM)入门级选手初学教程

链接&#xff1a;https://llmbook-zh.github.io/ 前言&#xff1a; GPT发展&#xff1a;GPT-1 2018 -->GPT-2&GPT-3&#xff08;扩大预训练数据和模型参数规模&#xff09;–> GPT-3.5&#xff08;代码训练、人类对齐、工具使用等&#xff09;–> 2022.11 ChatG…...

HTML 实例/测验之HTML 基础一口气讲完!(o-ωq)).oO 困

HTML 基础 非常简单的HTML文档 <!DOCTYPE html> <html><head><title>页面标题(w3cschool.cn)</title></head><body><h1>我的第一个标题</h1><p>我的第一个段落。</p></body> </html> 输出&a…...

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001&#xff0c; 组无重复数字的数002&#xff0c;企业发放的奖金根据利润提成003&#xff0c;完全平方数004&#xff0c;判断当天是这一年的第几天005&#xff0c;三个数由小到大输出006&#xff0c;输出字母C图案007&#xff0c;特殊图案008&…...

火星求生CE修改金钱,无限资金

由于火星求生前期没有资金非常难玩&#xff0c;想通过修改资金渡过前期&#xff0c;网上找了一圈修改器&#xff0c;只有修改无限声望和无限科研&#xff0c;就是没有无限资金&#xff0c;于是自己用CE修改 教程 首先查看自己资金是多少M&#xff0c;如下图我是22430M资金&…...

linux 内存管理-slab分配器

伙伴系统用于分配以page为单位的内存,在实际中很多内存需求是以Byte为单位的,如果需要分配以Byte为单位的小内存块时,该如何分配呢? slab分配器就是用来解决小内存块分配问题,也是内存分配中非常重要的角色之一。 slab分配器最终还是由伙伴系统分配出实际的物理内存,只不过s…...

docker-compose部署gitlab(亲测有效)

一.通过DockerHub拉取Gitlab镜像 docker pull gitlab/gitlab-ce:latest 二.创建目录 mkdir -p /root/tool/gitlab/{data,logs,config} && cd /root/tool/gitlab/ 三.编辑DockerCompose.yaml文件 vim /root/tool/gitlab/docker-compose.yml version: "3&quo…...

Leetcode 赎金信

利用hash map做 java solution class Solution {public boolean canConstruct(String ransomNote, String magazine) {//首先利用HashMap统计magazine中字符频率HashMap<Character, Integer> magazinefreq new HashMap<>();for(char c : magazine.toCharArray())…...

S7--环境搭建基本操作

1.修改蓝牙名称和地址 工程路径:$ADK_ROOT\adk\src\filesystems\CDA2\factory_default_config\ 在subsys7_config5.htf中 DeviceName = "DEVICE_NAME“ # replace with your device name BD_ADDRESS=[00 FF 00 5B 02 00] # replace with your BD address 2.earbud工程修改…...

webAPI中的排他思想、自定义属性操作、节点操作(配大量案例练习)

一、排他操作 1.排他思想 如果有同一组元素&#xff0c;我们想要某一个元素实现某种样式&#xff0c;需要用到循环的排他思想算法&#xff1a; 1.所有的元素全部清除样式 2.给当前的元素设置样式 注意顺序能不能颠倒&#xff0c;首先清除全部样式&#xff0c;再设置自己当前的…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...