C++学习笔记七之函数对象(仿函数)
一、函数对象概念
函数对象:定义了调用操作符()的类对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。
class A { public: int operator() ( int val ) { return val > 0 ? val : -val; } };
二、函数对象的优点
与普通函数相比,函数对象比函数更加灵活,函数对象的优势:
- 函数对象可以有自己的状态。我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态;
- 函数对象有自己特有的类型。我们可以传递相应的类型作为参数来实例化相应的模板,比如说带参数的函数形参。
三、谓词
1、概念
返回布尔类型的仿函数称为谓词。
2、分类
如果operator接受一个参数叫做一元谓词,接受两个参数叫做二元谓词。
四、STL内建函数对象
1、分类
①算数仿函数;②关系仿函数;③逻辑仿函数。
2、使用
这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以 产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件#include<functional>。
3、算数仿函数
//6个算数类函数对象,除了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>// 取 反 仿 函 数
4、关系仿函数
//6个关系运算类函数对象,每一种都是二元运算。 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>// 小 于 等 于
5、逻辑仿函数
//逻辑运算类运算函数,not为一元运算,其余为二元运算。 template<class T> bool logical_and<T>// 逻 辑 与 template<class T> bool logical_or<T>// 逻 辑 或 template<class T> bool logical_not<T>// 逻 辑 非
6、代码实例
①加法仿函数
void test02() { plus<int> p; cout << p(10, 20) << endl; //30 cout<<plus<int>()(100,300)<<endl; //300 }
②使用内建函数对象 改变排序规则
void test04() { vector<int> v; v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50); for_each(v.begin(),v.end(),[](int val){cout<<val<<" ";}); cout<<endl; //使用内建函数对象 改变排序规则 sort(v.begin(),v.end(), greater<int>() ); for_each(v.begin(),v.end(),[](int val){cout<<val<<" ";}); cout<<endl; }
③逻辑反函数
#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
using namespace std;
void test01()
{
vector<bool> v;
v.push_back(true);
v.push_back(false);
v.push_back(true);
v.push_back(false);
for (vector<bool>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//逻辑非 将v容器搬运到v2中,并执行逻辑非运算
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();
system("pause");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码