【C++中的STL】函数对象

函数对象

  • 函数对象概念
  • 谓词
    • 概念
  • 内建函数对象
    • 算术仿函数
    • 关系仿函数
    • 逻辑仿函数(基本用不到)

函数对象概念

重载函数调用操作符的类,其对象常称为函数对象,函数对象使用重载的()时。行为类似函数调用,也叫仿函数。
函数对象(仿函数)是一个类,不是一个函数。
使用特点:
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。函数对象超出普通函数的概念,函数对象可以有自己的状态,函数对象可以作为参数传递。

//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。
class myAdd {
public:int operator()(int a, int b) {return a + b;}
};
//函数对象超出普通函数的概念,函数对象可以有自己的状态
class B {
public:int count;//内部自己的状态B(){count = 0;}void operator()(string s) {cout << s << endl;this->count++;}};
//函数对象可以作为参数传递
void doP(B& b1, string b2) {b1(b2);
}
void test() {myAdd ma;cout << ma(10, 10) << endl;B b2;b2("dasfafasfg");b2("dasfafasfg");b2("dasfafasfg");b2("dasfafasfg");cout << "次数:" << b2.count << endl;B b3;doP(b3, "C++");
}

在这里插入图片描述

谓词

概念

返回bool类型的仿函数称为谓词,如果operator()接受一个参数,叫做一元谓词;如果operator()接受两个参数,叫做二元谓词。
一元谓词:
在这里插入图片描述

class CreateN {
public:bool operator()(int val) {return val > 5;}
};
void test() {vector<int> v;for (int i = 0;i < 5;i++) {v.push_back(i);}//查找容器中有没有大于5的数字,CreateN()匿名函数对象vector<int>::iterator it=find_if(v.begin(), v.end(), CreateN());if (it == v.end()) {cout << "没找到" << endl;}else {cout << "找到" << endl;}
}

二元谓词

class myCom {
public:bool operator()(int v, int v1) {return v > v1;}
};
void test() {vector<int> v;v.push_back(10);v.push_back(24);v.push_back(12);v.push_back(35);v.push_back(20);sort(v.begin(),v.end());for (vector<int>::iterator it = v.begin();it != v.end();it++) {cout << *it << endl;}cout << "---------------------" << endl;//使用函数对象改变算法规则,从大到小sort(v.begin(), v.end(),myCom());for (vector<int>::iterator it = v.begin();it != v.end();it++) {cout << *it << endl;}
}

在这里插入图片描述

内建函数对象

STL内建了一些函数对象,有算术仿函数、关系仿函数、逻辑仿函数,这些仿函数所产生的对象,用法和一般函数完全相同,使用内建函数对象,需要引入头文件**#include**

算术仿函数

实现四则运算,其中negate是一元运算,其他都是二元运算。
仿函数原型

1、template<class T> T plus < T >加法仿函数
2、template<class T> T minus < T >减法仿函数
3、template<class T> T multiplies < T >乘法仿函数
4、template<class T> T divides < T >除法仿函数
5、template<class T> T modulus < T >取模仿函数
6、template<class T> T negate < T >取反仿函数

void test() {//取反仿函数(一元用法)negate<int> n;cout << n(50) << endl;//加法仿函数(二元用法)plus<int> p;cout << p(10, 34) << endl;
}

关系仿函数

实现关系对比
仿函数原型
1、template<class T> T bool equal_to< T >等于
2、template<class T> T bool not_equal_to< T >不等于
3、template<class T> T bool greater< T >大于(最常用)
4、template<class T> T bool greater_equal< T >大于等于
5、template<class T> T bool less< T >小于
6、template<class T> T bool less_equal< T >小于等于

void test() {...for (vector<int>::iterator it = v.begin();it != v.end();it++) {cout << *it << "   ";}cout << endl;//降序  greater<int>()内建函数对象,和自己实现的仿函数效果一样sort(v.begin(), v.end(), greater<int>());
}

逻辑仿函数(基本用不到)

1、template<class T> T bool logical_and< T >逻辑与
2、template<class T> T bool logical_or< T >逻辑或
3、template<class T> T bool logical_not< T >逻辑非

void test() {....cout << endl;cout << "-----------------------------------------" << endl;//利用逻辑非,将容器v搬运到容器v1中,并执行取反操作vector<bool>v1;v1.resize(v.size());transform(v.begin(), v.end(), v1.begin(),logical_not<bool>());//搬运,必须要开辟不骗空间才可使用for (vector<bool>::iterator it = v1.begin();it != v1.end();it++) {cout << *it << "   ";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.F1 评分机器学习模型性能的常用的评估指标

F1评分作为机器学习领域中的一个综合性评价指标&#xff0c;旨在在准确率和召回率之间寻求平衡&#xff0c;进而提供对模型性能全面评估的手段。本文将深入探讨F1评分的定义、计算方法、应用领域、案例研究以及未来发展方向&#xff0c;力求为读者提供详实而全面的了解。 一.F…

osgEarth真HelloWorld

osgEarth真HelloWorld vcpkg installtests vcpkg install osgEarth安装指南 https://docs.osgearth.org/en/latest/install.html&#xff0c; 预先设置ports/osg/portfile.cmake GL3 否则调用osg相关功能时会出现如下提示 OpenSceneGraph does not define OSG_GL3_AVAILABLE; …

语音方向精典论文品读_HuBERT

英文名称: HuBERT: Self-Supervised Speech Representation Learning by Masked Prediction of Hidden Units 中文名称: HuBERT&#xff1a;通过隐藏单元的屏蔽预测进行自监督语音表示学习 链接: http://arxiv.org/abs/2106.07447v1 代码: https:// github.com/pytorch/fairseq…

vertica10.0.0单点安装_ubuntu18.04

ubuntu的软件包格式为deb&#xff0c;而rpm格式的包归属于红帽子Red Hat。 由于项目一直用的vertica-9.3.1-4.x86_64.RHEL6.rpm&#xff0c;未进行其他版本适配&#xff0c;而官网又下载不到vertica-9.3.1-4.x86_64.deb&#xff0c;尝试通过alian命令将rpm转成deb&#xff0c;但…

盘古信息IMS OS 数垒制造操作系统+ 产品及生态部正式营运

启新址吉祥如意&#xff0c;登高楼再谱新篇。2024年1月22日&#xff0c;广东盘古信息科技股份有限公司新办公楼层正式投入使用并举行了揭牌仪式&#xff0c;以崭新的面貌、奋进的姿态开启全新篇章。 盘古信息总部位于东莞市南信产业园&#xff0c;现根据公司战略发展需求、赋能…

redis过期事件监听、可以做延时任务 第二篇(简单)

在使用redis时&#xff0c;所有的key都要设置过期时间&#xff0c;过期之后&#xff0c;redis就会把对应的key清除掉。 此方法可以监听redis的key失效&#xff0c;在失效时做一些逻辑处理 redis过期监听 不像mq有保证 不推荐用来弄需要有保证的业务 现象&#xff1a; redis …

AWS 专题学习 P12 (CloudWatch、CloudTrail、AWS Config)

文章目录 专题总览1. CloudWatch1.1 Amazon CloudWatch Metrics1.2 CloudWatch Metric Streams1.3 CloudWatch LogsCloudWatch Logs - SourcesCloudWatch Logs Metric Filter & InsightsCloudWatch Logs – S3 ExportCloudWatch Logs SubscriptionsCloudWatch Logs Aggrega…

MATLAB|【完全复现】含可再生能源和储能的区域微电网的最优运行(考虑鲁棒性和不确定性)【多阶段鲁棒调度模型】

目录 主要内容 模型研究 一、区域微网模型 二、模型优化流程​ 结果一览 下载链接 主要内容 该程序实现了一种基于可再生能源和储能的区域微电网的多阶段优化调度方法&#xff0c;该方法可以同时保证优化调度方案的鲁棒性和非预测性。模型考虑两类不确定性&…

MySQL索引类型及数据结构【笔记】

1 索引类型 返回面试宝典 主键索引&#xff08;PRIMARY&#xff09;:数据列不允许重复&#xff0c;不允许为NULL&#xff0c;一个表只能有一个主键。 唯一索引&#xff08;UNIQUE&#xff09;:数据列不允许重复&#xff0c;允许为NULL&#xff0c;一个表允许多个列创建唯一索引…

AssertionError: Torch not compiled with CUDA enabled

目录 报错查看已安装的torch的版本卸载安装GPU版本的torch查看cuda版本手工安装通过pip命令手工安装。 结果更新cuda到12.1大功告成 报错 经查阅&#xff0c;这个问题是因为conda默认安装的是CPU版本的torch&#xff0c;应该使用GPU版本的。 查看已安装的torch的版本 pip li…

Apipost数据库连接使用

Apipost提供了数据库连接功能&#xff0c;在接口调试时可以使用数据库获取入参或进行断言校验。目前的Apipost支持&#xff1a;Mysql、SQL Sever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Redis、MongoDB 8种数据库的连接操作 新建数据库连接&#xff1a; 在「项目设置…

Doris 与 Clickhouse 对比(一)

1. 常用引擎 ☕️ Doris 表数据模型 duplicate key &#x1f3ac; 场景&#xff1a;适用于数据无需提前聚合的分析业务。 ⚠️ 注意点&#xff1a;只指定排序列&#xff0c;相同的行并不会合并。 unique key &#x1f3ac; 场景&#xff1a;适用于有更新需求的业务。 ⚠…

Optional lab: Linear Regression using Scikit-LearnⅠ

scikit-learn是一个开源的、可用于商业的机器学习工具包&#xff0c;此工具包包含本课程中需要使用的许多算法的实现 Goals In this lab you will utilize scikit-learn to implement linear regression using Gradient Descent Tools You will utilize functions from sci…

计算机设计大赛 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

MySQL DDL DML DQL DCL 通用语法

文章目录 DDL&#xff08;数据定义语言&#xff09;数据库操作表操作 DML&#xff08;数据操作语言&#xff09;添加数据注意事项 更新和删除数据 DQL&#xff08;数据查询语言&#xff09;基础查询条件查询聚合查询&#xff08;聚合函数&#xff09;分组查询排序查询分页查询D…

计算机网络:体系结构知识点汇总

文章目录 一、计算机网络概述1.1概念及功能1.2组成和分类1.3性能指标 二、体系结构与参考模型2.1分层结构、协议、接口、服务2.2OSI参考模型2.3TCP/IP参考模型 一、计算机网络概述 1.1概念及功能 计算机网络就是通过各个节点&#xff0c;这个节点包括终端的电脑&#xff0c;手…

0127-2-Vue深入学习5—Vue-Router路由模式

1、Vue-Router三种路由模式&#xff1a; hash&#xff1a;#️⃣使用URL hash 值来做路由&#xff0c;支持所有路由器&#xff1b;history:&#x1f4d6;依赖HTML5 History API和服务器配置&#xff1b;abstract:⛓支持所有JS运行环境&#xff0c;Node.js服务端&#xff1b; 1.1…

[网鼎杯 2018]Fakebook1

join一个用户后&#xff0c;点进去发现是这样的 查看这个页面的源代码&#xff0c;发现一个base64编码后的字串 decode之后就是我们join新用户时填入的blog网址 那我们是不是可以通过填入存储flag的地址&#xff0c;从而回显出来呢&#xff1f;当然&#xff0c;先按照常规sqli…

九、Kotlin 注解

1. 什么是注解 注解是对程序的附件信息说明。 注解可以作用在类、函数、函数参数、属性等上面。 注解的信息可用于源码级、编译期、运行时。 2. 注解类的定义 使用元注解 Retention 声明注解类的作用时期。 使用元注解 Target 声明注解类的作用对象。 定义注解类时可以声…

Centos7 双机单网卡安装 OpenStack

虚拟机配置 1&#xff1a;准备虚拟机2台&#xff0c;配置如下 openstack master----192.168.20.205 2cpu&#xff0c;8G内存&#xff0c;200G硬盘&#xff0c;网络桥接方式--静态IP----单网卡 node1计算节点---192.168.20.215 2cpu&#xff0c;8G内存&#xff0c;200G硬盘&a…