【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.hqwc.cn/news/433950.html

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

相关文章

java/node代码 破解“滑动验证码”的移动距离

1.直接上代码结论 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL;p…

svg 属性详解:填充与边框

svg 属性详解&#xff1a;填充与边框 1 颜色和透明度2 填充规则 fill-rule3 边框样式3.1 stroke-width3.2 stroke-linecap3.3 stroke-linejoin3.4 stroke-dasharray 1 颜色和透明度 图像都有颜色&#xff0c;svg 中可以使用属性 fill 和 stroke 来修改图形的颜色。fill 属性设置…

【RSA加密算法进行数字签名并验签--C++】

RSA加密算法进行数字签名并验签--C 前言RSA加密算法什么是RSA加密算法公钥加密私钥解密or私钥加密公钥解密&#xff1f;公钥加密&#xff0c;私钥解密&#xff08;常见用法&#xff09;&#xff1a;私钥加密&#xff0c;公钥解密&#xff08;较少用法&#xff0c;本次使用&…

自动驾驶的决策层逻辑

作者 / 阿宝 编辑 / 阿宝 出品 / 阿宝1990 自动驾驶意味着决策责任方的转移 我国2020至2025年将会是向高级自动驾驶跨越的关键5年。自动驾驶等级提高意味着对驾驶员参与度的需求降低&#xff0c;以L3级别为界&#xff0c;低级别自动驾驶环境监测主体和决策责任方仍保留于驾驶…

两个近期的计算机领域国际学术会议(软件工程、计算机安全):欢迎投稿

近期&#xff0c;受邀担任两个国际学术会议的Special session共同主席及程序委员会成员&#xff08;TPC member&#xff09;&#xff0c;欢迎广大学界同行踊跃投稿&#xff0c;分享最新研究成果。期待这个夏天能够在夏威夷檀香山或者加利福尼亚圣荷西与各位学者深入交流。 SERA…

专业120+总分400+海南大学838信号与系统考研高分经验海大电子信息与通信

今年专业838信号与系统120&#xff0c;总分400&#xff0c;顺利上岸海南大学&#xff0c;这一年的复习起起伏伏&#xff0c;但是最后还是坚持下来的&#xff0c;吃过的苦都是值得&#xff0c;总结一下自己的复习经历&#xff0c;希望对大家复习有帮助。首先我想先强调一下专业课…

Github 2024-01-27 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-27统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目3Jupyter Notebook项目2非开发语言项目2JavaScript项目1Go项目1Rust项目1Shell项目1 Papers We Lo…

【学网攻】 第(9)节 -- 路由器使用以及原理

系列文章目录 目录 系列文章目录 文章目录 前言 一、路由器是什么&#xff1f; 二、实验 1.引入 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan…

精品基于Uniapp+springboot助农管理系统App农产品积分购物商城

《[含文档PPT源码等]精品基于Uniappspringboot助农管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

鸿蒙HarmonyOS获取GPS精确位置信息

参考官方文档 #1.初始化时获取经纬度信息 aboutToAppear() {this.getLocation() } async getLocation () {try {const result await geoLocationManager.getCurrentLocation()AlertDialog.show({message: JSON.stringify(result)})}catch (error) {AlertDialog.show({message…

开源直播电商系统的实现方式(仿抖音电商模式)

当下&#xff0c;传统的图文电商模式正在走向没落&#xff0c;以“抖音”为首的直播电商模式备受用户追捧&#xff0c;它具有直观与互动的特点&#xff0c;拥有传统电商所不具备的优势。而且&#xff0c;当前正是直播电商的红利期&#xff0c;很多主播和品牌商都通过直播电商业…

fatal error:require():Failed opening required

今天部署网站遇到了个错误 fatal error:require():Failed opening required 这个错误经常遇到 大多是网站 是开启了 open_basedir 但今天这个错误很神奇 先说解决方法 1. 检测一下是不是真的 不存在这个文件 即使100%确定 也建议你再仔细看一下 这个文件存不存在 今天我遇…