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为要在各…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...