STL函数对象-C++
1. 函数对象
1.1 函数对象概念
概念:
- 重载函数调用操作符的类,其对象常称为函数对象
- 函数对象使用重载的 () 时,行为类似函数调用,也叫仿函数
本质:
函数对象(仿函数)是一个类,不是一个函数
1.2 函数对象使用
特点:
- 函数对象在使用的时候,可以像普通函数那样调用,可以有参数,可以有返回值
- 函数对象超出普通函数的概念,函数对象可以有自己的状态
因为函数对象本质是一个类,所以类的内部可以拥有一些成员属性来记录它的一些状态。
- 函数对象可以作为参数传递。
#include <iostream>
#include <string>
using namespace std;class MyAdd {
public:MyAdd() {this->count = 0;}int operator()(int v1, int v2) {count++;return v1 + v2;}public:int count;//内部自己的状态
};int doAdd(MyAdd& add, int v1, int v2) {return add(v1, v2);
}int main() {MyAdd myAdd;int ret = myAdd(10, 20);//1.cout << ret << endl;cout << myAdd.count << endl;//2.普通函数需要借助外力,使用全局变量或者静态变量记录使用的次数doAdd(myAdd, 20, 30);//3.return 0;
}
总结:
- 仿函数写法非常灵活,可以作为参数进行传递
2. 谓词
2.1 谓词概念
概念:
- 返回bool 类型的仿函数称为谓词
- 如果 operator() 接受一个参数,那么叫做一元谓词
- 如果 operator() 接收两个参数,那么叫做二元谓词
2.2 一元谓词
示例:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;class GreatFive
{
public:bool operator()(int val) {return val > 5;}
};int main() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}//查找容器中有没有大于 5 的数字vector<int>::iterator it = find_if(v.begin(), v.end(), GreatFive());//GreatFive():创建一个匿名的函数对象if (it == v.end()) {cout << "未找到" << endl;}else {cout << "找到了大于 5 的数字:" << *it << endl;}return 0;
}
find_if(first, last, Pred);
- 三个参数:first,last(区间),谓词(Pred)
- 按条件的方式来找一找有没有想要的结果,它会遍历区间取出来每个数据,仿函数判断是否满足条件,返回 真 或 假
- 若存在,函数返回该元素的迭代器;若不存在,返回 end();
- GreatFive():创建一个匿名的函数对象
总结:参数只有一个的谓词,称为一元谓词。
2.3 二元谓词
示例:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;class MyCompare
{
public:bool operator()(int v1, int v2) {return v1 > v2;}
};int main() {vector<int> v;v.push_back(10);v.push_back(40);v.push_back(20);v.push_back(30);v.push_back(50);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;return 0;
}
总结:参数只有两个的谓词,称为二元谓词。
3. 内建函数对象
3.1 内建函数对象意义
概念:
- STL 内建了一些函数对象
分类:
- 算数仿函数
- 关系仿函数
- 逻辑仿函数
用法:
- 这些仿函数所产生的对象,用法和一般函数完全相同
- 使用内建函数对象,需要引入头文件
#include <functional>
3.2 算数仿函数
功能描述:
- 实现四则运算
- 其中 negate 是一元运算,其他都是二元运算
仿函数原型:
template<class T> T plus<T>//加法仿函数template<class T> T minus<T>//减法仿函数template<class T> T multiplies<T>//乘法仿函数template<class T> T divides<T>//除法仿函数template<class T> T modulus<T>//取模仿函数template<class T> T negate<T>//取反仿函数
#include <iostream>
#include <functional>//内建函数对象的头文件
using namespace std;int main() {negate<int> n;cout << n(50) << endl;//1.plus<int> p;//默认认为传入相同的数据类型,不允许数据类型不同的两个数相加cout << p(2, 10) << endl;return 0;
}
总结:使用内建函数对象时,需要引入头文件 #include <functional>
3.3 关系仿函数
功能描述:
- 实现关系对比
仿函数原型:
template<class T> bool equal_to<T>//等于template<class T> bool not_equal_to<T>//不等于template<class T> bool greater<T>//大于template<class T> bool greater_equal<T>//大于等于template<class T> bool less<T>//小于template<class T> bool less_equal<T>//小于等于
#include <iostream>
#include <vector>
#include <functional>//内建函数对象的头文件
using namespace std;int main() {vector<int> v;v.push_back(10);v.push_back(40);v.push_back(20);v.push_back(30);v.push_back(50);for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;cout << "---------------------------------------------" << endl;//使用内建函数对象,改变算法策略,变为排序规则从大到小sort(v.begin(), v.end(), greater<int>());//默认情况下使用 less<>(),排序规则从小到大for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;return 0;
}
总结:关系仿函数中最常用的就是 greater<> 大于。
3.3 逻辑仿函数
功能描述:
- 实现逻辑运算
仿函数原型:
template<class T> bool logical_and<T>//逻辑与template<class T> bool logical_or<T>//逻辑或template<class T> bool logical_not<T>//逻辑非
逻辑仿函数在实际开发中是基本上用不着的,作演示使用。
#include <iostream>
#include <vector>
#include <functional>//内建函数对象的头文件
#include <algorithm>
using namespace std;int main() {vector<bool> v;v.push_back(true);v.push_back(false);v.push_back(true);v.push_back(false);v.push_back(false);for (vector<bool>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;cout << "---------------------------------------------" << endl;//利用逻辑非,将容器 v 搬运到容器 v2 中,并执行取反操作vector<bool> v2;v2.resize(v.size());//目标容器必须提前开辟预定大小的空间,否则报错transform(v.begin(), v.end(), v2.begin(), logical_not<bool>());//(原容器的begin,原容器的end,目标容器的begin,仿函数)//把原容器中的数据都搬到目标容器中。//仿函数可以实现在搬运过程中做一些逻辑运算for (vector<bool>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;return 0;
}
transform(原容器的 begin, 原容器的 end, 目标容器的 begin, 仿函数);
- 把原容器中的数据都搬到目标容器中。
- 仿函数可以实现在搬运过程中做一些逻辑运算
- 目标容器必须提前开辟预定大小的空间,否则报错
总结:逻辑仿函数实际应用中较少,了解即可
相关文章:
STL函数对象-C++
1. 函数对象 1.1 函数对象概念 概念: 重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的 () 时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类,不…...
Ubuntu 设置Nginx开机自启
1.建立自启动服务文件 vim /usr/lib/systemd/system/nginx.service Descriptionnginx - high performance web server Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx…...
npm中的npx命令
1.概念 npx是一个执行npm软件包的二进制文件,通俗的讲,他可以执行npm的一些指令。 2.示例 用babel将ES6语法转为ES5语法 npx babel src/js -d dist/js会执行babel的相关功能,如果没有安装,也会自动安装。 当在执行npx <co…...
python绘制Z形图 青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析2023年5月
目录 python绘制Z形图 一、题目要求 二、算法分析 三、程序代码...
conda环境下module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘
1 问题描述 在训练语音模型时,出现如下错误: Traceback (most recent call last):File "/opt/Bert-VITS2-2.0.2.1/train_ms.py", line 660, in <module>run()File "/opt/Bert-VITS2-2.0.2.1/train_ms.py", line 282, in run…...
蓝桥杯每日一题2023.11.26
题目描述 奖券数目 - 蓝桥云课 (lanqiao.cn) 将每一个数字进行一一枚举,如果检查时不带有数字4则答案可以加1 #include<bits/stdc.h> using namespace std; int ans; bool check(int n) {while(n){if(n % 10 4)return false;n / 10; }return true; } int m…...
Centos 7.9 Install Docker Insecure Registry
文章目录 1. 镜像存储规划2. 安装定制 docker3. 部署 registry4. 验证镜像仓库 1. 镜像存储规划 linux LVM /dev/sdb mount dir /data【linux LVM 磁盘挂载目录】 创建两个目录 一个 docker 数据存储目录 :/data/docker,默认一般为linux为 /var/lib/d…...
探秘网络通信:UDP与TCP/IP的奥秘
**> 🎏:你只管努力,剩下的交给时间 🏠 :小破站 探秘网络通信:UDP与TCP/IP的奥秘 前言第一:UDP基础概念UDP的基础概念:UDP的特点和优势UDP与TCP/IP的关系 工作原理1. 无连接性和面…...
Docker的学习笔记
1.1 docker的介绍 1.2 docker的一次安装 //如果是root用户,不加sudo也行curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -echo deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster stable…...
解析直播第三方美颜SDK:技术原理与应用
时下,直播平台和主播们纷纷引入美颜技术,以提升视觉效果和用户体验。而在众多美颜技术中,直播第三方美颜SDK成为许多开发者和平台的首选,因其灵活性和高效性而备受推崇。 一、技术原理:美颜算法的精髓 第三方美颜SDK…...
线程基本方法
1。设置线程名 继承Thread类的线程,可以直接使用.setName()方法,设置线程名。也可以使用构造方法,需要注意java默认不继承构造方法,所以需要自己调用下父类的构造方法。 public class Demo {public static void main(String[…...
Linux操作系统 1.初识Linux
一、Linux学习大致内容 二、操作系统概述 操作系统的作用: 常见操作系统: 1、pc(电脑端):windows、Linux、MacOS 2、移动端:Android、ios、鸿蒙系统 总结 1.计算机由哪两个部分组成?、 硬件…...
分布式事务-两阶段提交2PC
2PC协议就是两阶段提交,用来解决分布式事务,分为两个阶段,分别为Prepare和Commit,也是PC由来。 第一阶段Prepare 提交事务请求 如图所示,主要流程有以下三个方面 询问:事务协调者(Manager)向所有的事务参与…...
初识Spring (Spring 核心与设计思想)
文章目录 什么是 Spring什么是容器什么是 IoC理解 Spring IoCDI 概念 什么是 Spring Spring 官网 官方是这样说的: Spring 让每个人都能更快、更轻松、更安全地进行 Java 编程。春天的 专注于速度、简单性和生产力使其成为全球最受欢迎Java 框架。 我们通常所说的 Spring 指的…...
智能优化算法应用:基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.教与学算法4.实验参数设定5.算法结果6.参考文献7.…...
Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换
我们已经执行了 Bitcoin SV 和 Bitcoin Core 之间的首次原子交换。 这一成就代表了比特币 SV 的重大进步,以去信任的方式促进了与其他区块链的无缝互操作性。 图片源自Gemini 在上一篇文章中,我们解释了原子交换的高级理论。 我们深入研究了使用哈希时间…...
RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数
论文地址:官方Inner-IoU论文地址点击即可跳转 官方代码地址:官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址: 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…...
JDBC编程基础
JDBC编程基础 JDBC介绍创建JDBC项目的步骤1.引入依赖2.注册驱动3.获取数据库连接4.获取sql执行对象 JDBC 常用 API 详解sql执行对象PreparedStatement作用 事务管理结果集对象 JDBC项目demo测试 JDBC介绍 每个数据库都会提供一组API来支持程序员实现自己客户端,自己…...
Linux shell命令
Linux shell命令 1、Shell简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问…...
Vue 3 面试经验分享
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
LaTeX论文排版集成:自动调用万象熔炉·丹青幻境生成论文插图
LaTeX论文排版集成:自动调用万象熔炉丹青幻境生成论文插图 写论文最头疼的是什么?对我而言,除了反复修改的正文,就是那些永远也画不完的插图。尤其是写综述或者理论性强的文章,需要大量的概念图、流程图、示意图来辅助…...
BGE-Reranker-v2-m3能否替代BM25?语义检索对比评测
BGE-Reranker-v2-m3能否替代BM25?语义检索对比评测 在构建智能问答、文档检索这类系统时,我们常常面临一个核心难题:如何从海量文档中,精准地找到用户真正需要的那几段信息?传统的关键词匹配方法,比如BM25…...
OpenClaw+千问3.5-27B代码助手:自动生成Python脚本并测试运行
OpenClaw千问3.5-27B代码助手:自动生成Python脚本并测试运行 1. 为什么需要代码生成与执行的自动化? 作为开发者,我经常遇到这样的场景:脑子里有个想法需要快速验证,比如抓取某个网站的数据做分析。传统流程是手动写…...
OpenClaw自动化办公实战:千问3.5-9B处理日报与会议纪要
OpenClaw自动化办公实战:千问3.5-9B处理日报与会议纪要 1. 为什么选择OpenClaw处理办公杂务 去年冬天的一个深夜,我盯着电脑屏幕上一堆未处理的会议录音和零散的邮件摘要,突然意识到自己每周要花至少5小时做这些重复性工作。当时我尝试过各…...
OpenClaw浏览器控制:Qwen3-14b_int4_awq驱动自动化检索与信息提取
OpenClaw浏览器控制:Qwen3-14b_int4_awq驱动自动化检索与信息提取 1. 为什么需要浏览器自动化助手 上周我需要做一个小型竞品分析,任务很简单:找出10个同类产品的核心功能点并整理成表格。但当我手动打开浏览器逐个搜索、翻页、复制粘贴时&…...
xray mitm模块配置全解析:从证书路径到访问限制的避坑指南
Xray MITM模块配置全解析:从证书路径到访问控制的实战指南 当你第一次在终端里看到could not find expected :这样的错误提示时,可能完全摸不着头脑。作为一款强大的安全评估工具,Xray的MITM(中间人)模块配置确实存在不…...
PostgreSQL 安装指南:常见问题排查与实战解决方案
1. PostgreSQL安装前的准备工作 第一次接触PostgreSQL的朋友可能会觉得安装过程有点复杂,但其实只要做好准备工作,安装过程就会顺利很多。我在帮团队部署PostgreSQL环境时,发现90%的安装问题都源于前期准备不足。下面分享几个关键点ÿ…...
实现 Rand10():python3 题解
1. 题目理解目标:实现一个函数 rand10(),返回 1 到 10 之间的均匀随机整数。 限制:只能使用给定的 rand7() 函数,它返回 1 到 7 之间的均匀随机整数。 核心要求:均匀分布。这意味着生成 1、2、...、10 的概率必须完全相…...
OpenClaw 接入微信,QQ,飞书的正确方法-周红伟
OpenClaw 接入微信 OpenClaw(原 Clawdbot)是一个开源、本地优先的 AI 代理网关,能让大模型在你的电脑/服务器上 7X24 小时运行,支持直接操作电脑、浏览网页、执行命令,还能无缝接入飞书、Telegram、Discord 等聊天平台…...
不用公网IP!用Ollama+Chatbox搭建家庭AI助手(内网穿透方案对比)
家庭AI助手实战:OllamaChatbox内网部署与穿透方案全解析 在智能家居技术快速发展的今天,将AI能力引入家庭环境已成为技术爱好者的新宠。想象一下,当你躺在沙发上用手机就能调用书房电脑运行的Llama 3大模型,或者在厨房平板上随时获…...
