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

C++ 仿函数(一)

目录

一、仿函数是什么?

二、仿函数的特点

1.仿函数在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值

2.仿函数超出普通函数的概念,可以有自己的状态

​编辑3.仿函数可以作为参数传递。

三、谓词

一元谓词示例:

二元谓词示例:

总结

一、仿函数是什么?

        仿函数也叫函数对象,是定义了一个含有operator()成员函数的对象,可以视为一个一般的函数,只不过这个函数功能是在一个类中的运算符operator()中实现,它将函数作为参数传递的方式来使用。

二、仿函数的特点

1.仿函数在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值

class MyAdd
{
public:int operator()(int v1, int v2){return v1 + v2;}
};//1.函数对象在使用时,可以像普通函数那样调用,可以有参数和返回值
void test01()
{MyAdd myAdd;cout << myAdd(1, 2) << endl;
}

 结果输出:3

2.仿函数超出普通函数的概念,可以有自己的状态

//2、函数对象可以有自己的状态
class MyPrint
{
public:MyPrint(){count = 0;}void operator()(string test){cout << test << endl;count++; //统计使用次数}int count; //内部自己的状态
};
void test02()
{MyPrint myPrint;myPrint("hello world");myPrint("hello world");myPrint("hello world");cout << "myPrint调用次数为: " << myPrint.count << endl;
}

运行结果:


3.仿函数可以作为参数传递。

//3、函数对象可以作为参数传递
void doPrint(MyPrint& mp, string test)
{mp(test);
}void test03()
{MyPrint myPrint;doPrint(myPrint, "Hello C++");
}

 运行结果:

优点:
        1.仿函数可有拥有自己的数据成员和成员变量,比一般函数灵活。
        2.仿函数比函数指针的执行速度快。
        3.仿函数可以作为模板参数使用,因为每个仿函数都拥有自己的类型。

缺点:
        1.需要单独实现一个类。
        2.定义形式比较复杂。

三、谓词

仿函数返回值类型是bool数据类型,称为谓词

如果operator接受一个参数,那么称为一元谓词;如果接受两个参数,那么称为二元谓词

一元谓词示例:

//1.一元谓词 参数中只有一个的谓词,称为一元谓词
struct GreaterFive {bool operator()(int val) {return val > 15;}
};void test01() {vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}//查找容器中有没有大于5的数字//GreateFive(),匿名函数对象vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()) {cout << "没找到!" << endl;}else {cout << "找到:" << *it << endl;}}

 因为我们设置的vector容器中的数是0-9,所以无法找到15,故输出“没找到”

二元谓词示例:

//二元谓词
class MyCompare
{
public:bool operator()(int num1, int num2){return num1 > num2;}
};void test02()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(5);v.push_back(7);v.push_back(9);//默认从小到大sort(v.begin(), v.end());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;cout << "----------------------------" << endl;//使用函数对象改变算法策略,排序从大到小sort(v.begin(), v.end(), MyCompare());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}

运行结果:

 

总结

        本文让我们对仿函数有了初步的认识,知道了什么是仿函数,仿函数的优缺点还有什么是谓词。

相关文章:

C++ 仿函数(一)

目录 一、仿函数是什么&#xff1f; 二、仿函数的特点 1.仿函数在使用时&#xff0c;可以像普通函数那样调用, 可以有参数&#xff0c;可以有返回值 2.仿函数超出普通函数的概念&#xff0c;可以有自己的状态 ​编辑3.仿函数可以作为参数传递。 三、谓词 一元谓词示例&a…...

MATLAB连续LTI系统的时域分析(十)

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 1、实验目的&#xff1a; 1&#xff09;掌握利用MATLAB对系统进行时域分析的方法&#xff1b; 2&#xff09;掌握连续时间系统零输入响应的求解方法&#xff1b; 3&#xff09;掌握连续时间系统零状态响应、冲激响应和…...

HBuilderX使用

HBuilderX使用&#xff08;Vue前后端分离&#xff09; 概述&#xff1a;DCloud开发者后台 DAccount Service 1、官网下载开发工具&#xff1a;HBuilderX-高效极客技巧 注意&#xff1a;安装目录路径中不能出现中文特殊字符&#xff0c;否则会造成项目无法编译。比如C:/Progr…...

【JavaSE】多态(多态实现的条件 重写 向上转移和向下转型 向上转型 向下转型 多态的优缺点 避免在构造方法种调用重写的方法)

文章目录 多态多态实现的条件重写向上转移和向下转型向上转型向下转型 多态的优缺点避免在构造方法种调用重写的方法 多态 一种事物&#xff0c;多种形态。 多态的概念&#xff1a;去完成某个行为&#xff0c;当不同对象去完成时会产生出不同的状态。 多态实现的条件 1.必须…...

MySQL学习---13、存储过程与存储函数

1、存储过程概述 MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将负杂的SQL逻辑封装在一起&#xff0c;应用程序无序关注存储过程和函数内部复杂的SQL逻辑&#xff0c;而只需要简单的调用存储过程和函数就可以。 1.1 理解 含义&#xff1a;存储过程的英文是Sto…...

Mysql日志管理、备份与恢复

文章目录 一、Mysql日志管理1.mysql日志2.日志种类3.日志的查询4.配置日志文件 二、Mysql备份与分类1.数据备份的重要性 一、Mysql日志管理 1.mysql日志 Mysql的日志默认保存位置为/usr/local/mysql/date&#xff0c;Mysql的日志配置文件为/etc/my.cnf&#xff0c;里面有一个…...

STM32单片机声控语音识别RGB彩灯多种模式亮度可调WS2812彩灯

实践制作DIY- GC0129-语音识别RGB彩灯 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别RGB彩灯 二、功能介绍&#xff1a; STM32F103C系列最小系统板5VUSB电源64个灯珠的WS2812灯板1个开关键&#xff08;3档亮度调节&#xff09;1个模式切换键&#xff08;白灯 红灯…...

高校9大学术工具推荐,一定要用起来哦!

1、文献管理工具&#xff1a;例如EndNote、Mendeley和Zotero&#xff0c;这些工具可以帮助您整理、管理和引用文献。 2、数据分析工具&#xff1a;例如SPSS、R和Python等&#xff0c;用于进行统计分析和数据处理。 3、学术写作工具&#xff1a;例如LaTeX和Microsoft Word&…...

记一次压力测试

性能测试文档 背景 为对产品性能有一定了解&#xff0c;现将产品展开一次性能测试&#xff1b; 环境与工具 本章为基本工具准备及linux命令说明&#xff0c;无先后顺序。 Xshell工具 本文使用Xshell在Windows界面下远程登录linux主机安装Xshell直接全部选择默认选项即可&…...

一个文明是否有竞争力,在很大程度上取决于信息传递的效率。

文章目录 引言I 有效地传递信息1.1 信息传播分类1.2 信息传递的有效性II 科技进步的必要条件和充分条件2.1 能量总量2.2 能量密度2.3 衡量科技成就的大小2.4 科学的诞生的意义:获得叠加式收益引言 科技进步的必要条件是能量总量,而充分条件是能量密度。一个文明是否有竞争力,…...

测试4年,跳槽一次涨8k,我跳了3次···

最近有人说&#xff0c;现在测试岗位初始工资太低了&#xff0c;有些刚刚入行的程序员朋友说自己工资连5位数都没有.....干了好几年也没怎么涨。看看别人动辄月薪2-3万&#xff0c;其实我想说也没那么难。说下如何高效地拿到3w。 1.暂且把刚入行的条件设低些吧&#xff0c;大专…...

Redis 入门教程(简单全面版)

1 安装&#xff1a; 1.1 生产环境安装 注意&#xff1a; 1、如果安装过程有问题可以参考源代码中的 README.md 文件 2、如果服务器只安装一个 redis 通常选择 /usr/local/redis 作为安装目录&#xff0c;如果安装多台则建议带上 服务名称 区分&#xff08;建议带上 服务名称 区…...

java并发-AQS

当我们使用Java并发编程时&#xff0c;我们经常会听到“AQS”的概念。AQS代表“AbstractQueuedSynchronizer”&#xff0c;是Java并发包中的一个重要组件。AQS提供了一个框架&#xff0c;使得开发者可以轻松地实现各种同步器&#xff0c;例如锁&#xff0c;信号量&#xff0c;倒…...

openAI图像生成开发文档

图像生成 了解如何使用我们的 DALLE 型号 介绍 图像 API 提供了三种与图像交互的方法&#xff1a; 根据文本提示从头开始创建图像根据新的文本提示创建现有图像的编辑创建现有图像的变体 本指南介绍了使用这三个 API 终结点的基础知识以及有用的代码示例。要了解它们的实际…...

Python综合案例—利用tkinter实现计算器的程序

目录 一、导入 tkinter 库 定义全局变量 二、定义回调函数 三、创建窗口对象 四、创建标签控件 五、创建数字按钮 六、创建加、减、乘、除和等于按钮 七、创建清空按钮 八、总结 用Python实现计算器可以让我们更好地理解面向对象编程、GUI 编程和事件驱动编程等概念&a…...

canvas学习笔记

其实还有react还没有学&#xff0c;但是公司技术栈里面有canvas&#xff0c;所以先系统学习一下canvas 一、canvas 简介 ​<canvas> 是 HTML5 新增的&#xff0c;一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也…...

Navicat Premium 15安装注教程

Navicat Premium 15安装 准备工作 下载好安装包navicat150_premium_cs_x64和安装完成Navicat Premium 15 链接&#xff1a;https://pan.baidu.com/s/1TJs3pjAXJXhu7-13DJLzpg 提取码&#xff1a;hunk 安装Navicat Premium 15 无脑操作&#xff0c;下一步下一步就行了&…...

yolo v8

这个系列代码被封装的非常的精致&#xff0c;对二次开发不太友好&#xff0c;虽然也还是可以做些调节 模型的导出 有三种方式试过&#xff0c;都可以导出onnx的模型 1. 用yolov8 源码来自&#xff1a;ultralytics\yolo\engine\exporter.py (不固定尺寸) yolo export modelpa…...

2022IDEA的下载、安装、配置与使用

文章目录 1.IntelliJ IDEA 介绍1.2 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA 的主要功能介绍1.3.1 语言支持上1.3.2 其他支持 1.4 IDEA 的主要优势&#xff1a;(相较于 Eclipse 而言)1.5 IDEA 的下载地址1.6 官网提供的详细使用文档 2.windows 下安装过程2.1 安装前的…...

实验十 超市订单管理系统综合实验

实验十 超市订单管理系统综合实验 应粉丝要求&#xff0c;本博主帮助实现基本效果&#xff01; 未避免产生版权问题&#xff0c;本项目博主不公开源码&#xff0c;如果您遇到相关问题可私聊博主&#xff01; 一、实验目的及任务 通过该实验&#xff0c;掌握利用SSM框架进行系…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...