STL --- 五. 函数对象 Function Objects
目录
1、函数对象的定义和作用
2、函数对象的分类和使用
3、std 常用的函数对象
4、函数对象的适配器
5、std 算法和函数对象区别
1、函数对象的定义和作用
STL(Standard Template Library)中的函数对象(Functor)是一种重载了函数调用运算符(operator())的类,可以像函数一样被调用。
函数对象可以在STL算法中被使用,作为函数参数传递给算法,可以实现一些常规函数无法实现的算法操作。
函数对象有以下作用:
(1)作为STL算法的参数,实现算法的灵活性和可扩展性。
(2)作为一种封装机制,可以将函数和状态信息打包在一起,提供更加灵活的函数调用方式。
(3)可以提供一些常规函数无法实现的算法操作,如状态保存,算法优化等。
(4)函数对象在STL中被广泛应用,如排序、查找、遍历、变换等。
2、函数对象的分类和使用
STL函数对象可以分为以下几类:
(1)一元函数对象:只有一个参数的函数对象,例如:negate、logical_not、plus、minus等。
(2)二元函数对象:有两个参数的函数对象,例如:plus、minus、multiplies、divides等。
(3)比较函数对象:用于比较两个值的函数对象,例如:less、greater、equal_to等。
(4)逻辑函数对象:用于逻辑运算的函数对象,例如:logical_and、logical_or、logical_not等。
(5)谓词函数对象:用于判断一个值是否满足某个条件的函数对象,例如:greater、less、equal_to等。
函数对象在STL中被广泛使用,例如在算法中作为参数传递,或者在容器中作为元素存储。
使用函数对象可以让代码更加简洁、清晰、可读性更强,提高代码的可维护性和可扩展性。
STL函数对象 示例:
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;int main() {vector<int> v{5, 2, 8, 4, 9, 1};// 使用greater函数对象排序sort(v.begin(), v.end(), greater<int>());// 输出排序后的结果for (int i : v) {cout << i << " ";}cout << endl;// 使用lambda函数对象排序sort(v.begin(), v.end(), [](int a, int b) {return a < b;});// 输出排序后的结果for (int i : v) {cout << i << " ";}cout << endl;// 使用plus函数对象求和int sum = accumulate(v.begin(), v.end(), 0, plus<int>());// 输出求和结果cout << "Sum: " << sum << endl;return 0;
}
输出结果:
9 8 5 4 2 1
1 2 4 5 8 9
Sum: 29
在上面的示例中,我们使用了STL函数对象greater、lambda和plus。其中,greater用于排序,lambda用于排序和自定义比较函数,plus用于求和。这些函数对象都是STL中内置的,我们可以直接使用。
3、std 常用的函数对象
#include <>
1. plus:加法函数对象
2. minus:减法函数对象
3. multiplies:乘法函数对象
4. divides:除法函数对象
5. modulus:取模函数对象
6. negate:取反函数对象
7. equal_to:等于函数对象
8. not_equal_to:不等于函数对象
9. greater:大于函数对象
10. less:小于函数对象
11. greater_equal:大于等于函数对象
12. less_equal:小于等于函数对象
13. logical_and:逻辑与函数对象
14. logical_or:逻辑或函数对象
15. logical_not:逻辑非函数对象
16. unary_function:一元函数对象
17. binary_function:二元函数对象
4、函数对象的适配器
STL函数对象的适配器是一种用于修改现有函数对象的工具。
适配器允许您使用现有的函数对象来解决新问题或修改现有的函数对象以满足新的要求。
STL函数对象的适配器有以下几种:
(1)bind1st和bind2nd适配器: 这些适配器用于将一个二元函数对象转换为一个一元函数对象。bind1st适配器将第一个参数绑定到函数对象中,bind2nd适配器将第二个参数绑定到函数对象中。
(2)not1和not2适配器: 这些适配器用于将一个谓词函数对象转换为其否定形式。
(3)mem_fun和mem_fun_ref适配器: 这些适配器用于将一个成员函数转换为一个函数对象。
(4)compose1和compose2适配器: 这些适配器用于将两个函数对象合并为一个函数对象。
(5)ptr_fun适配器: 这个适配器用于将一个普通函数指针转换为一个函数对象。
这些适配器的使用可以大大增强STL函数对象的灵活性和可重用性。
5、std 算法和函数对象区别
STL中的算法和函数对象都是为了方便程序员使用而设计的,但它们的作用和使用方式有所不同。
(1)算法是一组预定义好的操作序列,可以用于对容器中的元素进行遍历、查找、排序等操作。STL中提供了很多常用的算法,如sort、find、replace等。这些算法都是通过迭代器来访问容器中的元素,所以它们可以适用于各种不同类型的容器。
(2)函数对象是一种可调用的对象,它可以像函数一样被调用。STL中的函数对象通常用于算法中,用来定义某些操作的行为。比如,STL中的sort算法可以接受一个函数对象作为参数,用来定义排序的方式。STL中提供了很多常用的函数对象,如less、greater、plus等。
总的来说,算法是对容器中的元素进行操作的一种方式,而函数对象则是用来定义操作行为的一种方式。算法和函数对象的结合可以实现更加灵活和高效的编程。
相关文章:
STL --- 五. 函数对象 Function Objects
目录 1、函数对象的定义和作用 2、函数对象的分类和使用 3、std 常用的函数对象 4、函数对象的适配器 5、std 算法和函数对象区别 1、函数对象的定义和作用 STL(Standard Template Library)中的函数对象(Functor)是一种重载…...
Java IO 流操作详解
Java IO 流操作详解 一、简介1. 什么是IO流2. IO流的分类3. IO流的作用 二、Java IO流的输入操作1. 文件输入流2. 字节输入流3. 缓冲输入流4. 对象输入流 三、Java IO流的输出操作1. 文件输出流2. 字节输出流3. 缓冲输出流4. 对象输出流 四、Java IO流的常用方法解析1. 字节读写…...
Halcon 形状匹配参数详解
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score) find_shape_model(Image : : //搜索图像 ModelID, //模板句柄 AngleStart, // 搜索时的起始角度 AngleExte…...
C++11强类型枚举
C11引入了强类型枚举(enum class),也称为枚举类。 强类型枚举是一种更加类型安全的枚举类型,相对于传统的枚举类型,强类型枚举可以提供更好的安全性和可读性。 强类型枚举的格式如下: enum class 枚举名 …...
pytorch讲解(部分)
友爱的目录 自动求导机制从后向中排除子图自动求导如何编码历史信息Variable上的In-place操作In-place正确性检查 CUDA语义最佳实践使用固定的内存缓冲区使用 nn.DataParallel 替代 multiprocessing 扩展PyTorch扩展 torch.autograd扩展 torch.nn 多进程最佳实践共享CUDA张量最…...
C++ 基本的7种数据类型和4种类型转换(C++复习向p3)
文章目录 基本内置类型存储范围typedef 声明新名字enum 枚举类型类型转换 基本内置类型 boolcharintfloatdoublevoidwchar_t ⇒ short int 存储范围 可以这样 sizeof(int) 来确认 int 占用字节数 char,1字节,-128~127 或 0~255 wchar_t,2…...
Scrum敏捷迭代规划和执行
Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的,在Leangoo中,我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog(迭代)看板,用于管理当前Sprint的需求和开发任务,可视化展示每…...
智警杯赛前学习1.1---excel基本操作
修改默认设置 步骤一:打开“Excel选项”窗口,打开“文件”菜单,选择“选项”标签 步骤二:在“Excel选项”窗口中,选择“常规与保存”标签,在“常规与保存”标签中,可以修改录入数据时的默认字体…...
【Android】Handle(一) 主要特点和用途
在Android中,Handler是一种消息处理机制,它允许我们在不同线程之间交换信息并更新UI。具体来说,Handler可以将一个Runnable或Message对象加入到消息队列中,并在合适的时间去执行它们。 以下是Handler的主要特点和用途:…...
40亿个QQ号,限制1G内存,如何去重?【已通过代码实现】
前几天发现一个有趣的文章 “40亿个QQ号,限制1G内存,如何去重?”,发现很有意思,就想着用代码实现一下,下面是分析和实现过程 一、审题分析 一个 QQ 号现在最长有 11 位,因为 int 是四字节,数值范围是2的31次方,因此得使用 long 存储,但考虑到实现,使用 int 存储(1…...
Talk预告 | 新加坡国立大学张傲:10%成本定制类 GPT-4 多模态大模型
本期为TechBeat人工智能社区第502期线上Talk! 北京时间06月01日(周四)20:00,新加坡国立大学在读博士生 — 张傲的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “10%成本定制类 GPT-4 多模态大模型 ”,届时将介…...
从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法
前面已经对 string 类进行了简单的介绍和应用,大家只要能够正常使用即可。 在面试中,面试官总喜欢让学生自己 来模拟实现string类, 最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。 为了更深入学习STL,下面我…...
reduce()方法详解
一、 定义和用法 reduce() 方法将数组缩减为单个值。 reduce() 方法为数组的每个值(从左到右)执行提供的函数。 函数的返回值存储在累加器中(结果/总计)。 注释:对没有值的数组元素,不执行 reduce() 方法。…...
C++虚假唤醒
概念: 虚假唤醒是指在使用条件变量时,线程被唤醒但条件并没有满足,导致线程执行错误的情况,这个过程就是虚假唤醒。 虚假唤醒弊端: 虚假唤醒会导致程序的正确性受到影响,因为唤醒的线程并没有满足条件&…...
【AI】dragonGPT - 单机部署、极速便捷
dragonGPT 从数据私有化,到prompt向量库匹配,再到查询,一条龙服务,单机部署,极简操作 pre a.需要下载gpt4all model到本地. ggml Model Download Link 然后将存放model的地址写入.env MODEL_PATH your pathb.…...
Uuiapp使用生命周期,路由跳转传参
Uniapp生命周期: 1. beforeCreate:在实例初始化之后,数据观测和事件配置之前被调用。 2. created:在实例创建完成后被立即调用。 3. beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。 …...
定积分的计算(牛顿-莱布尼茨公式)习题
前置知识:定积分的计算(牛顿-莱布尼茨公式) 习题1 计算 ∫ 0 2 ( x 2 − 2 x 3 ) d x \int_0^2(x^2-2x3)dx ∫02(x2−2x3)dx 解: \qquad 原式 ( 1 3 x 3 − x 2 3 x ) ∣ 0 2 ( 8 3 − 4 6 ) − 0 14 3 (\dfrac 13x^3-…...
leak 记录今天的一个小题
先看题, add没有大小限制,这里edit可以溢出8字节,也就是可以改后边的size,可以调用4次free没有调用函数只是把指针置0,show可以用一次. void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) {init_0(a1, a2, a3);while ( 1 ){menu();switch ( read_n() ){cas…...
软考A计划-试题模拟含答案解析-卷二
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...
【C++】pthread
一、pthread简介 pthread是C98接口且只支持Linux,使用时需要包含头文件#include <pthread.h>,编译时需要链接pthread库,其中p是POSIX的缩写,而POSIX是Portable Operating System Interface的缩写,是IEEE为要在各…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
