c++的函数对象和适配器

函数对象

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
bool func(int val1,int val2)
{return val1 > val2;
}
void test()
{vector<int>v;v.push_back(2);v.push_back(7);v.push_back(4);//sort(v.begin(), v.end(),func);//降序sort(v.begin(), v.end(), greater<int>());for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });//[](int val) {cout << val << " "; }[]是匿名函数
}
//函数对象与普通函数的区别
//1:函数对象能有自己的状态
//2:普通函数没有类型,但函数对象有
//3:函数对象比普通函数更有效率,(成员函数自动申请为内联函数)
void test01()
{plus<int>myplus;cout << myplus(3, 5) << endl;
}
int main()
{test01();system("pause");return 0;
}

适配器

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
void print(int val)
{cout << val << " ";
}
struct myfunc
{bool operator()(int val){cout << val << " "<<endl;return true;}
};
//struct myfunc2
//{
//	bool operator()(int val)
//	{
//		cout << val + 10 << " ";
//		return true;
//	}
//};
//第一步:继承binary_function<参数一,参数二,返回类型>
struct myfunc2 :public binary_function<int, int, void>
{void operator()(int val1, int val2)const{cout << val1 + val2 << " ";//第三步实现函数体}
};
void test()
{vector<int>v;v.push_back(2);v.push_back(34);v.push_back(122);//for_each(v.begin(), v.end(), print);for_each(v.begin(), v.end(), myfunc());//返回时每个都加十for_each(v.begin(), v.end(), bind2nd(myfunc2(),10));//第四步:用bind2nd绑定函数对象
}
//bind1st把10绑定给第一个参数,bind2nd把10绑定给第二个参数
//函数对象适配器not1 not2取反
//1:not1和not2区别:not1针对一元函数对象,not2针对二元函数对象
//第一步:继承
struct mynotfunc:public unary_function<int,bool>
{bool operator()(int val)const//第二步:变常函数{return val >= 20;}
};
int myfind(int val)
{return val > 20;
}
void test02()
{vector<int>v;v.push_back(2);v.push_back(34);v.push_back(122);vector<int>::iterator it=find_if(v.begin(), v.end(),not1( mynotfunc()));//第三步:适配//vector<int>::iterator it = find_if(v.begin(), v.end(), myfind);if (it == v.end()){cout << " 查找失败" << endl;}else{cout << " 查找成功" << *it << endl;//结果:打印出2}
}
//not2的使用
struct myprint
{bool operator()(int val1){cout << val1 << " ";return true;}};
struct mysort
{bool operator()(int val1, int val2){return val1 > val2;}
};
void test03()
{vector<int>v;v.push_back(2);v.push_back(34);v.push_back(122);//sort(v.begin(), v.end(),mysort());//debug下会报错sort(v.begin(), v.end(), not2(less<int>()));//for_each(v.begin(), v.end(), myprint());for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });
}
//普通函数进行适配
//第一步:把一个参数变两个参数
void myprint1(int val,int val2)
{cout << val+val2 << " ";
}
void test04()
{vector<int>v;v.push_back(2);v.push_back(34);v.push_back(122);//第二步:把普通函数变函数对象ptr_funfor_each(v.begin(), v.end(), bind2nd(ptr_fun(myprint1),100));
}
//成员函数适配
class maker
{
public:maker(string name, int age){this->name = name;this->age = age;}void myprint2(){cout << "name:" << name << " " << "age:" <<age << endl;}
public:string name;int age;
};
//void myprint2(maker& m)
//{
//	cout << "name:" << m.name << " " << "age:" << m.age << endl;
//}void test05()
{vector<maker>v;v.push_back(maker("aaa", 10));v.push_back((maker("huihui", 18)));v.push_back(maker("hhh", 20));//for_each(v.begin(), v.end(), myprint2);//当容器存储的是对象,用mem_fun_ref来适配它的成员函数for_each(v.begin(), v.end(),mem_fun_ref( & maker::myprint2));vector<maker*>v2;v2.push_back(new maker("aaa", 10));v2.push_back((new maker("huihui", 18)));v2.push_back(new maker("hhh", 20));//当容器存储的是对象指针,用mem_fun来适配它的成员函数for_each(v2.begin(), v2.end(), mem_fun(&maker::myprint2));}
int main()
{test05();system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/192534.shtml

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

相关文章

P2 Linux系统目录结构

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专…

二维数组处理(一)

输入整型二维数组a&#xff08;5行5列&#xff09;&#xff0c;完成如下要求&#xff1a; 输出二维数组a。 将a的第2行和第4行元素对调后&#xff0c;形成新的二维数组a并按行输出&#xff0c;每个元素之间隔一个空格。(行号从0开始计算)。 用对角线&#xff08;指二维数组左…

如何跑通跨窗口渲染:multipleWindow3dScene

New 这是一个跨窗口渲染的示例&#xff0c;用 Three.js 和 localStorage 在同一源&#xff08;同产品窗口&#xff09;上跨窗口设置 3D 场景。而这也是本周推特和前端圈的一个热点&#xff0c;有不少人在争相模仿它的实现&#xff0c;如果你对跨窗口的渲染有兴趣&#xff0c;可…

linux 安装go环境

下载go SDK All releases - The Go Programming Language 此处建议选择与本机windows一样的版本&#xff0c;便于调试&#xff0c;若不涉及本地windows&#xff0c;则忽略此提示 上传到linux 解压go SDK 执行下述命令进行解压 tar -xvf go1.19.linux-amd64.tar.gz 此处选择…

tcp/ip协议 error=10022 Winsock.reg Winsock2.reg

tcp/ip协议 error10022 这2个注册表选项千万不能删除&#xff0c;否则上不了网。 按下windows键R键&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;在文件目录里找到如下两个文件夹&#xff0c;删除这两个文件夹。 路径&#xff1a;HKEY_LOCAL_MACHINE\System\C…

12.二维字符数组——输出basic和BASIC

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维字符数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 输出basic和BASIC 二、题目分析 法一&#xff1a; for(i0;i<1;i){ for(j0;j<6;j){ putchar(a[i][j]); pri…

RxJava

Single 使用 Flowable 比较重一般使用Single onSubscribe 产生订阅时调用 线程切换1 2 发送顺序事件.just just 源码 钩子方法,进行验证再处理 Single 对象 订阅,RxJavaPlugins.onSubscribe 钩子方法,产生订阅和过滤 Single 核心方法,抽象的,实现为SingleJust 订阅和执行成功回…

视图层与模板层

视图层 1 视图函数 一个视图函数&#xff0c;简称视图&#xff0c;是一个简单的Python 函数&#xff0c;它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容&#xff0c;一个重定向&#xff0c;一个404错误&#xff0c;一个XML文档&#xff0c;或者一张图片. . . 是…

穷游?“穷”游?

Description 贫穷的小A有一个梦想&#xff0c;就是到t国去一次穷游&#xff0c;但现实是残酷的。小A所在的世界一共有n(n<500)个国家&#xff0c;国家与国家之间总共有E(E<50000)条道路相连&#xff0c;第i个国家对于进入它的外国人都要收取Bi的费用&#xff0c;而小A家住…

93基于matlab的萤火虫算法优化支持向量机(GSA-SVM)分类模型

基于matlab的萤火虫算法优化支持向量机&#xff08;GSA-SVM&#xff09;分类模型&#xff0c;以分类精度为优化目标优化SVM算法的参数c和g&#xff0c;输出分类可视化结果。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 93萤火虫算法优化支持向量机 (xiaoh…

盘点25个Html游戏Game源码网页爱好者不容错过

盘点25个Html游戏Game源码网页爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 下载链接&#xff1a;https://pan.baidu.com/s/1lSNLjWB4xMuLV8m_kDtczw?pwd6666 提取码&#xff1a;6666 项目名称 21点游戏 H5…

将多个字节对象组成的列表中的多个字节对象连接成为一个字节对象bytes.join()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将多个字节对象组成的列表 中的多个字节对象 连接成为一个字节对象 bytes.join() [太阳]选择题 请以下代码输出的结果是&#xff1f; byte_list [bK,be,by] print("【显示】byte_list&q…

智慧用电安全动态监控系统

智慧用电安全动态监控系统是一种先进的电力监控技术系统&#xff0c;它运用物联网、大数据、云计算等先进技术&#xff0c;对电力系统的运行状况进行实时监控和预警。 该系统依托电易云-智慧电力物联网&#xff0c;通过智能传感终端采集电气线路的实时运行数据&#xff0c;客户…

面试题:说说 Cookie、Session、Token、JWT?

文章目录 什么是认证&#xff08;Authentication&#xff09;什么是授权&#xff08;Authorization&#xff09;什么是凭证&#xff08;Credentials&#xff09;什么是 Cookiecookie 重要的属性 什么是 Sessionsession 认证流程 Cookie 和 Session 的区别什么是 Token&#xff…

vscode console.log快捷键

在 Visual Studio Code 中&#xff0c;您可以使用快捷键「Ctrl Shift P」&#xff08;Mac 用户请使用「Cmd Shift P」&#xff09;打开命令面板&#xff0c;然后输入「Editor: Insert Console.log」即可快速插入「console.log」代码。此快捷键已内置于 Visual Studio Code …

23种设计模式之C++实践(二)

23种设计模式之C++实践 3. 设计模式(二)组合型模式7. 适配器模式——不兼容结构的协调7.2:类适配器模式7.3:双向适配器模式适配器模式总结8.桥接模式——处理多维度变化桥接模式总结9. 组合模式——树形结构的处理9.2 透明组合模式9.3 安全组合模式组合模式总结10. 装饰模式…

解读Java虚拟机垃圾回收器:探究经典算法背后的奥秘

目录 一、GC分类与性能指标 &#xff08;一&#xff09;垃圾回收器分类 &#xff08;二&#xff09;性能指标 &#xff08;三&#xff09;不可能三角 二、不同的垃圾回收器概述 三、Serial回收器&#xff1a;串行回收 四、ParNew回收器&#xff1a;并行回收 五、Parall…

php使用CORS解决跨域

CORS 是一种由 W3C 制定的跨域资源共享标准&#xff0c;通过在服务器端设置 HTTP 头来实现跨域请求。 在 PHP 中&#xff0c;可以通过设置响应头来启用 CORS&#xff1a; <?php // 服务器端 PHP 文件 header(Access-Control-Allow-Origin: *); // 允许所有域名访问 heade…

Spring Boot 集成 spring security 01

一、导入依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

态势感知是什么

在当今高度信息化的时代&#xff0c;信息安全风险已经成为企业、政府和个人的重要关注点。为了有效应对这些风险&#xff0c;态势感知成为了一种日益重要的能力。态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力&#xff0c;是以安全大数据为基础&#xff0c;从全局…