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

函数对象-C++

1.定义

2.特点

1.解释第一句

#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:void operator()(string s){cout << s << endl;}
};
int main()
{print print;print("hello world");return 0;
}

2.解释第二句

可以有自己的状态:指的是他和普通的函数不同,例如他可以统计自己调用了几次。

也就是说,它可以向函数一样被调用,但是却拥有类的功能,他是类和函数的结合。

#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:print(){this->count = 0;}void operator()(string s){cout << s << endl;this->count++;}int count;
};
int main()
{print print;print("hello world");print("hello world");print("hello world");print("hello world");print("hello world");cout << print.count << endl;return 0;
}

3.解释第三句

#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:print(){this->count = 0;}void operator()(string s){cout << s << endl;this->count++;}int count;
};
void test(print p, string s)
{p(s);
}
void test01()
{print print;test(print, "C++");
}
int main()
{test01();return 0;
}

函数对象不仅可以作为函数参数,还可以再调用的函数中去使用自己重载过的小括号

具体见

void test(print p, string s)
{
    p(s);
}

3.内建函数对象

1.定义

2.内建函数对象-算数仿函数

1.函数原型

2.取反仿函数(一元仿函数)
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include <iostream>
int main()
{negate<int>n;cout << n(10) << endl;return 0;
}
3.加法仿函数(二元仿函数)
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include <iostream>
int main()
{plus<int>n;cout << n(10,20) << endl;return 0;
}

注意:plus模板参数列表中只需要有一个int就行,是为了防止出现两个不同类型的数据相加

4.内建函数对象-关系仿函数

1.函数原型

2.代码
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include<algorithm>
#include <iostream>
int main()
{vector<int> v;v.push_back(1);v.push_back(5);v.push_back(3);v.push_back(2);sort(v.begin(), v.end(), greater<int>());for (int i = 0; i < v.size(); i++){cout << v[i] << endl;}return 0;
}

5.内建函数对象-逻辑仿函数

1.函数原型

2.代码
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include<algorithm>
#include <iostream>
int main()
{vector<int> v;v.push_back(1);v.push_back(5);v.push_back(3);v.push_back(2);vector<int> v1;v1.resize(v.size());transform(v.begin(), v.end(),v1.begin(), logical_not<bool>());for (int i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;return 0;
}

其中用到了搬运函数transform,需要提前给他开辟相应的空间

    v1.resize(v.size());
    transform(v.begin(), v.end(),v1.begin(), logical_not<bool>());

4.注意

逻辑仿函数实际应用较少,了解即可

相关文章:

  • Linux 系统的启动流程
  • 树莓派超全系列教程文档--(30)autoboot.txt介绍
  • 2000-2017年各省发电量数据
  • 【Java学习笔记】关键字汇总
  • 嵌入式软件--stm32 DAY 1
  • 每日算法-链表(23.合并k个升序链表、25.k个一组翻转链表)
  • 用Prompt 技术【提示词】打造自己的大语言智能体
  • 第十六届蓝桥杯大赛软件赛省赛 C++ 大学 B 组 部分题解
  • UEFI Spec 学习笔记---12 - Protocols —CONSOLE SUPPORT(一)
  • 网络安全知识点2
  • 前端api(请求后端)简易template
  • 多模态模型 Grounding DINO 初识
  • HFSS(李明洋)学习记录1
  • 算法:双指针(快慢指针|对撞指针)、快排、模拟、二分、贪心
  • 4月17号
  • Ubuntu利用docker搭建Java相关环境问题记录
  • 影视产业链中的律师角色以及合规风控要点
  • Electricity Market Optimization 探索系列(VII)- 直流潮流方程的推导及例题
  • 自然语言处理(NLP)领域大图
  • 速盾:高防CDN访问多了会影响源站吗?
  • 吉林省公安厅出入境管理总队政委明志全已任省安保集团总经理
  • 牛市早报|今年国内核电项目审批首次开闸,离境退税起退点下调
  • 经济日报:多平台告别“仅退款”,规则调整有何影响
  • 伊朗港口爆炸已致40人死亡
  • 荣盛发展去年亏损约84.43亿元,要“过苦日子、紧日子”
  • 新加坡选情渐热:播客、短视频各显神通,总理反对身份政治