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

STL——函数对象,谓词

一、函数对象

1.函数对象概念

概念:

        重载函数调用操作符的类,其对象常称为函数对象。

        函数对象使用重载的()时,行为类似函数调用,也叫仿函数。

本质:

        函数对象(仿函数)是一个类,不是一个函数。

2.函数对象使用

特点:

        函数对象在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值函数对象超出普通函数的概念,函数对象可以有自己的状态。

        函数对象可以作为参数传递。

#include <iostream>
#include <string>
using namespace std;
class MyAdd
{
public:int operator()(int v1, int v2){return v1 + v2;}
};
class MyPrint
{
public:MyPrint(){this->count = 0;}void operator()(string test){cout << test << endl;this->count++;}int count;
};
void test01()
{MyAdd myadd;cout << myadd(10, 10) << endl;
}
void test02()
{MyPrint myprint;myprint("hello world");myprint("hello world"); myprint("hello world");myprint("hello world");cout << myprint.count << endl;//调用次数
}
void doPrint(MyPrint& mp,string test)
{mp(test);
}
void test03()
{MyPrint myprint;doPrint(myprint,"hello world");
}
int main()
{test01();test02();test03();return 0;
}

二、谓词

1.谓词概念

概念:

        返回bool类型的仿函数称为谓词。

        如果operator()接受一个参数,那么叫做一元谓词如果operator()接受两个参数,那么叫做二元谓词。

bool operator()(int val)
{return val > 5;
}
bool operator()(int val1, int val2)
{return val1 > val2;
}

二、内建函数对象

1.算数仿函数

功能描述:

        实现四则运算

        其中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 <vector>
#include<algorithm>
using namespace std;
class Greaterfive
{
public:bool operator()(int val1, int val2){return val1 > val2;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(40);v.push_back(50);v.push_back(20);v.push_back(30);sort(v.begin(), v.end());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//从大到小sort(v.begin(), v.end(), Greaterfive());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{test01();return 0;
}

2.关系仿函数

功能描述:

        实现关系对比

        仿函数原型:
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 <algorithm>
#include <functional>
using namespace std;
class Greaterfive
{
public:bool operator()(int val1, int val2){return val1 > val2;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(40);v.push_back(50);v.push_back(20);v.push_back(30);for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//降序//sort(v.begin(), v.end(), Greaterfive());//greater<int>() 内建函数对象sort(v.begin(), v.end(), greater<int>());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;}
int main()
{test01();return 0;
}

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 <algorithm>
#include <functional>
using namespace std;
void test01()
{vector<bool>v;v.push_back(true);v.push_back(false);v.push_back(false);v.push_back(true);for (vector<bool>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//非vector<bool>v2;v2.resize(v.size());transform(v.begin(), v.end(), v2.begin(), logical_not<bool>());//取反操作for (vector<bool>::iterator it = v2.begin(); it != v2.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{test01();return 0;
}

相关文章:

  • VMware虚拟机三种网络模式设置 - Bridged(桥接模式)
  • 王老吉“杀疯啦”?传统品牌如何创新营销“破圈”而出
  • 《计算机英语》 Unit 3 Software Engineering 软件工程
  • vue实现不预览PDF的情况下打印pdf文件
  • 【专业英语 复习】第10章 Information System
  • 奔驰EQS SUV升级原厂主动式氛围灯效果展示
  • Ruby 注释
  • AcWing 255. 第K小数
  • C++之std::queue::emplace
  • ArcGIS与Excel分区汇总统计三调各地类面积!数据透视表与汇总统计!
  • 在同一个 Blazor 应用中结合 SQL-DB 和 MongoDB
  • windows设置开机启动项
  • 如何卸载宝塔面板?
  • 代码随想三刷二叉树篇4
  • 外观模式(大话设计模式)C/C++版本
  • 【翻译】babel对TC39装饰器草案的实现
  • interface和setter,getter
  • 大快搜索数据爬虫技术实例安装教学篇
  • 如何在GitHub上创建个人博客
  • 入口文件开始,分析Vue源码实现
  • 三栏布局总结
  • 什么软件可以剪辑音乐?
  • 使用 Docker 部署 Spring Boot项目
  • 手机端车牌号码键盘的vue组件
  • 数据结构java版之冒泡排序及优化
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我看到的前端
  • 学习笔记TF060:图像语音结合,看图说话
  • Java总结 - String - 这篇请使劲喷我
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (06)金属布线——为半导体注入生命的连接
  • (3)llvm ir转换过程
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (PADS学习)第二章:原理图绘制 第一部分
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)基于IDEA的JAVA基础1
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET C# 使用 iText 生成PDF
  • .NET Core中如何集成RabbitMQ
  • .Net mvc总结
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .Net小白的大学四年,内含面经
  • .Net中ListT 泛型转成DataTable、DataSet
  • ::什么意思
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [000-01-022].第06节:RabbitMQ中的交换机介绍