STL之函数适配器

1.理论知识

这里写图片描述
这里写图片描述
这里写图片描述

2.常用函数适配器

标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象。常用适配器是:

1绑定器(binder):

binder通过把二元函数对象的一个实参绑定到一个特殊的值上,将其转换成一元函数对象。C++标准库提供两种预定义的binder适配器:bind1st和bind2nd,前者把值绑定到二元函数对象的第一个实参上,后者绑定在第二个实参上。

2取反器(negator) :

negator是一个将函数对象的值翻转的函数适配器。标准库提供两个预定义的ngeator适配器:not1翻转预定义一元函数对象的真值,而not2翻转二元谓词函数的真值。

常用函数适配器列表如下:

bind1st(op, value)
bind2nd(op, value)
not1(op)
not2(op)
mem_fun_ref(op)
mem_fun(op)
ptr_fun(op)

3.典型案例

class IsGreat
{
public:IsGreat(int i){m_num = i;}bool operator()(int &num){if (num > m_num){return true;}return false;}
protected:
private:int m_num;
};void main43()
{vector<int>  v1;for (int i=0; i<5; i++){v1.push_back(i+1);}for (vector<int>::iterator it = v1.begin(); it!=v1.end(); it ++){cout << *it << " " ;}int num1 = count(v1.begin(), v1.end(), 3);cout << "num1:" << num1 << endl;//通过谓词求大于2的个数int num2 = count_if(v1.begin(), v1.end(), IsGreat(2)); cout << "num2:" << num2 << endl;//通过预定义函数对象求大于2的个数   greater<int>() 有2个参数 //                                              param > 2int num3 = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 2 ) );cout << "num3:" << num3 << endl;//取模 能被2整除的数 求奇数int num4 = count_if(v1.begin(), v1.end(), bind2nd(modulus <int>(), 2 ) ); cout << "奇数num4:" << num4 << endl;int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd(modulus <int>(), 2 ) ) ); cout << "偶数num5:" << num5 << endl;return ;
}

4.预定义函数对象和适配器案例代码

#include <iostream>
using namespace std;#include "string"
#include <vector>
#include <list>
#include "set"
#include <algorithm>
#include "functional"//plus<int> 预定义好的函数对象 能实现不同类型的数据的 + 运算
//实现了 数据类型 和算法的分离 ===》通过函数对象技术实现的。。。。//思考:怎么样知道 plus<type> 是两个参数
void main21()
{/*template<class _Ty>struct plus: public binary_function<_Ty, _Ty, _Ty>{   // functor for operator+_Ty operator()(const _Ty& _Left, const _Ty& _Right) const{   // apply operator+ to operandsreturn (_Left + _Right);}};*/plus<int> intAdd;int x = 10; int y = 20;int z = intAdd(x, y); // x + y cout << "z:" << z << endl;plus<string> stringAdd;string s1 = "aaa";string s2 = "bbb";string s3 = stringAdd(s1, s2);cout << "s3:" << s3 << endl;vector<string> v1;v1.push_back("bbb");v1.push_back("aaa");v1.push_back("ccc");v1.push_back("zzz");v1.push_back("ccc");v1.push_back("ccc");/*template<class _Ty>struct greater: public binary_function<_Ty, _Ty, bool>{   // functor for operator>bool operator()(const _Ty& _Left, const _Ty& _Right) const{   // apply operator> to operandsreturn (_Left > _Right);}};*/sort(v1.begin(), v1.end(), greater<string>() );for (vector<string>::iterator it=v1.begin(); it!=v1.end(); it++){cout << *it << endl;}//求 ccc 出现的个数string sc = "ccc";//equal_to<string>() 有两个参数 left参数来自容器,right参数来自sc//bind2nd函数适配器 :把预定义函数对象 和 第二个参数进行绑定int num = count_if(v1.begin(), v1.end(), bind2nd(equal_to<string>(), sc) );cout << "num: " << num << endl;
}class IsGreat
{
public:IsGreat(int i){m_num = i;}bool operator()(int &num){if (num > m_num){return true;}return false;}
private:int m_num;
};void main22()
{vector<int> v1;for (int i=0; i<10; i++){v1.push_back(i+1);}for (vector<int>::iterator it=v1.begin(); it!=v1.end(); it++ ){cout << *it << " ";}cout << endl;int num1 = count(v1.begin(), v1.end(), 3);cout << "num1:" << num1 <<endl;//通过 谓词 求大于2 的个数int num2 = count_if(v1.begin(), v1.end(),  IsGreat(2));cout << "num2:" << num2 <<endl;/*template<class _Ty>struct greater: public binary_function<_Ty, _Ty, bool>{   // functor for operator>bool operator()(const _Ty& _Left, const _Ty& _Right) const{   // apply operator> to operandsreturn (_Left > _Right);}};*///通过 预定义的函数对象 求大于2 的个数//greater<int>() 有两个参数 左参数来自容器的元素 ,右参数固定成2 (通过bind2nd做的)int num3 = count_if(v1.begin(), v1.end(), bind2nd (greater<int>(), 2) );cout << "num3:" << num3 <<endl;//求 奇数的个数int num4 = count_if(v1.begin(), v1.end(), bind2nd (modulus<int>(), 2) );cout << "奇数的个数num4:" << num4 <<endl;//求 偶数的个数 取反器(negator) int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd (modulus<int>(), 2) ) );cout << "偶数的个数 num5:" << num5 <<endl;}
void main2222()
{//main21();main22(); //函数适配器综合案例cout<<"hello..."<<endl;system("pause");return ;
}

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

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

相关文章

真正理解 git fetch, git pull 以及 FETCH_HEAD

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 真正理解 git fetch, git pull 要讲清楚git fetch&#xff0c;git pull,必须要附加讲清楚git remote&#xff0c;git merge 、远程rep…

pyqt5 + pyinstaller 制作爬虫小程序

环境:mac python3.7 pyqt5 pyinstaller ps: 主要是熟悉pyqt5, 加入了单选框 输入框 文本框 文件夹选择框及日历下拉框 效果图: pyqt5 主程序文件 # -*- coding: utf-8 -*- # Author: Mehaei # Date: 2019-07-10 13:02:56 # Last Modified by: Mehaei # Last Modified time…

通过学校区域

通过学校区域的要求 应观察前后左右的交通情况&#xff0c;适时减速慢行&#xff0c;不得鸣喇叭和与学生抢行。 操作方法 当驾驶车辆行至学校附近或有注意儿童标志路段时&#xff0c;一定要及时减速&#xff0c;注意观察道路两侧或周围的情况&#xff0c;时刻堤防学生横…

axios中出现两次请求,OPTIONS请求和GET请求

在项目中发现ajax中出现两次请求&#xff0c;OPTIONS请求和GET请求 查看到浏览器NetWork有两次请求&#xff0c;请求url一样&#xff1a; 查找原因是浏览器对简单跨域请求和复杂跨域请求的处理区别。 XMLHttpRequest会遵守同源策略(same-origin policy). 也即脚本只能访问相同协…

笔试面试收获(持续更新中)

1. Internet 是有ARPANET发展而来 2. NFS&#xff08;Network File System&#xff09;即网络文件系统 3. OSI参考模型七层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff08;IP,路由器&#xff0c;三层交换机&#xff09;&#xff0c;传输层&#xff…

Linux 安装 配置 Maven

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.需要提前安装JDK&#xff0c;并且配置环境变量 请参考&#xff1a;https://blog.csdn.net/jiangyu1013/article/details/84321146 2.…

Threading in C#

这里推荐一些C#编程多线程的学习资料&#xff1a; http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html Ebook in English&#xff1a;http://cid-068f7d75d8585700.skydrive.live.com/self.aspx/ebook/threading.pdf 一些demo&#xff1a;http://cid-068f7…

经理人如何与这“六种人”打交道?

在职场中&#xff0c;我们要与不同身份、不同年龄、不同岗位、不同性别、不同性格的人打交道。在平时的实际工作接触中&#xff0c;善于与不同人打交道的经理人&#xff0c;会根据不同的情况用不同的态度和方式来对待之。 1、如何与死板的人打交道 与这样的人交往&#xff0c…

[Git高级教程 (一)] 通过 Tag 标签回退版本修复 bug

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1 前言 本系列之所以取名”Git高级教程”&#xff0c;主要是教大家解决实际工作中遇到的问题&#xff0c;要求读者会基本的Git用法和命令…

Javascript 自定义输出

缘由 前段时间再看了一些javascript的学习资料,也写的一些demo,在输出的时候一般都用alert,但这个方法会打断函数运行,用起来不是很好.还有就是console.log这个方法,这种方法原来一直以为只能在FireFox上面才能用,现在才发现主流浏览器都支持.但我的这个插件已经写的差不多了,所…

不要打2岁内和6岁后的孩子 父母必看

一位妈妈说&#xff1a;“孩子经常无理取闹&#xff0c;到超市就要买这买那&#xff0c;不给买就坐在地上哭闹。到别人家去就乱翻乱动&#xff0c;还会到人家沙发上乱蹦&#xff0c;无论你怎么说&#xff0c;孩子都不听话。每次我都会气不打一处来&#xff0c;回到家就痛打一顿…

设计模式之开放封闭原则

以下皆是个人理解如有不对请留言指出&#xff0c;谢谢&#xff01; 我就代码提出我自己个人的看法&#xff1a; 正常定义一个类例如银行工作员&#xff0c;他可以执行存款&#xff0c;付款和转账功能&#xff0c;如果在现有功能上我想添加贷款功能&#xff0c;需要在类中添加…

[Git高级教程(二)] 远程仓库版本回退方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况&#xff0c;于是做了一下研究&#xff0c;写下这篇博客。 2 问题 如果提交了…

uplift model学习笔记

一、解决的问题&#xff1a; 通常的 Propensity Model 和 Response Model 只是给目标用户打了个分&#xff0c;并没有确保模型的结果可以使得活动的提升最大化&#xff1b;它没有告诉市场营销人员&#xff0c;哪个用户最有可能提升活动响应&#xff1b; 因此&#xff0c;需要另…

必须看透的50个错觉 人生要看透而不看破!

我们应该感谢命运的多喘&#xff0c;是它用历练使一颗脆弱心的渐渐变得坚强&#xff0c;变得对一切都充满了向往。无可否认&#xff0c;只有真正的经历了一些事物之后&#xff0c;你才会对人生看得更加透彻&#xff0c;才会对世间真情感悟的更加真切。 1、个人只能被现实改变…

设计模式之依赖倒置原则

在传统的过程式中&#xff0c;上层依赖于底层&#xff0c;当底层变化&#xff0c;上层也得跟着做出相应的变化。这就是面向过程的思想&#xff0c;弊端就是导致程序的复用性降低并且提高了开发的成本。 而面向对象的开发则很好的解决了这个问题&#xff0c;让用户程序依赖于抽象…

@Transactional 详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Transactional 是声明式事务管理 编程中使用的注解 1 .添加位置 1&#xff09;接口实现类或接口实现方法上&#xff0c;而不是接口类中…

LiveGBS高性能GB28181国标流媒体服务流传输模式支持UDP、TCP被动、TCP主动模式

LiveGBS国标(GB28181)流媒体服务软件&#xff1a; 提供用户管理及Web可视化页面管理&#xff1b; 提供设备状态管理&#xff0c;可实时查看设备是否掉线等信息&#xff1b; 实时流媒体处理&#xff0c;PS&#xff08;TS&#xff09;转ES&#xff1b; 设备状态监测、云台控制、录…

通过人行横道线

学车中的通过人行横道线 人行横道线&#xff0c;俗称斑马线&#xff0c;是由一条一条的白色线组成的&#xff0c;主要是用来让行人穿越马路的。 驾驶员驾驶车辆通过人行横道时应该减速缓行&#xff0c;注意礼让行人。 考核要求 当驾车进入路面有施划人行横道线的&#xf…

python学习-38迭代器和生成器

迭代器和生成器---- 迭代器协议和for循环工作机制1.迭代器协议&#xff1a;对象必须提供一个next方法&#xff0c;执行该方法要么返回迭代中的下一项&#xff0c;要么引起一个Stoplteration异常&#xff0c;以终止迭代&#xff08;只能往后走&#xff0c;不能往前走&#xff09…