当前位置: 首页 > 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;
}
http://www.lryc.cn/news/379700.html

相关文章:

  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • atcoder abc 358
  • 手写docker:你先玩转namespace再来吧
  • 注册安全分析报告:PingPong
  • mysqladmin——MySQL Server管理程序(二)
  • Microsoft Edge无法启动搜索问题的解决
  • Appium Android 自动化测试 -- 元素定位
  • C#.net6.0+Vue+Ant-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解
  • 6G时代,即将来临!
  • 进程、线程的区别
  • JWT详解、JWTUtil工具类的构建方法
  • 江协科技51单片机学习- p11 静态数码管显示
  • pandas.frame输出parquet
  • 【CT】LeetCode手撕—42. 接雨水
  • GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国
  • C# + easyui 写的一个web项目
  • JVM 垃圾回收分配及算法
  • 尚品汇-(四)
  • colima配置docker镜像源
  • Linux_内核缓冲区
  • 步步精:连接器领域的卓越品牌
  • 【Linux】基础IO_3
  • ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取
  • 计算机系统基础实训七-MallocLab实验
  • 周末总结(2024/06/22)
  • 2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第二部分)【AI测试版】
  • SpringCloud-nacos基础
  • git的Cherry pick
  • LLC开关电源开发:第四节,LLC软件设计报告
  • 力扣85.最大矩形