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为要在各…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...