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,一经查实,立即删除!

相关文章

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…

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

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

Linux 安装 配置 Maven

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

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

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

Javascript 自定义输出

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

uplift model学习笔记

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

设计模式之依赖倒置原则

在传统的过程式中&#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; 设备状态监测、云台控制、录…

RuntimeException 和 Exception 区别、异常的子父级关系

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.java 将所有的错误封装为一个对象&#xff0c;其根本父类为Throwable, Throwable 有两个子类&#xff1a;Error 和 Exception。 2.Err…

C语言笔记(关键字)

gdb调试 gcc 源程序 -g&#xff1b;加gdb调试信息gdb可执行程序&#xff1b;&#xff08;gdb调试&#xff09;l&#xff08;ist&#xff09;&#xff1a;查看源码&#xff0c;按一下从main开始10行以此往后l n&#xff1a;查看n处上下10行的源码run&#xff1a;运行程序b&…

C语言笔记(符号)

注释符号 几个似非而是的注释问题 例子&#xff1a; (A) int / * ... * /i; (B) char * s "abcdefgh //hijklmn"; (C) //Is it a \valid comment? (D) in/ * ... * /t i; 我们知道C语言里可以有两种注释方式&#xff1a;“/* */” 和 “ // ”。那么上面几条…

java 命令: jmap 命令使用 ( 查看内存使用、设置 )

jdk安装后会自带一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照&#xff0c;从而可以离线分析堆&#xff0c;以检查内存泄漏&am…

只用一套解决方案,就可解决80%的交通物流行业信息难题

行业背景 新中国成立70多年来&#xff0c;中国交通运输总体上已经形成了多节点、全覆盖的综合运输网络&#xff0c;“五纵五横”综合运输大通道基本贯通&#xff0c;一大批综合客运、货运枢纽站场&#xff08;物流园区&#xff09;投入运营&#xff0c;取得了一系列瞩目成果&am…

Linux 使用 jstat 命令查看 jvm 的 GC 情况

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Options&#xff0c;选项&#xff0c;我们一般使用 -gcutil 查看gc情况 vmid&#xff0c;VM的进程号&#xff0c;即当前运行的java进程号…

Docker 方式安装 Nginx 、阿里云服务器上装 Ngnix

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 非 Docker 方式安装&#xff0c;直接 Linux 安装见另一文&#xff1a;Linux 上 安装 nginx 、阿里云服务器上安装 nginx 1. 直接从镜像仓…

C#实现A*算法

理解A*寻路算法具体过程 这两天研究了下 A* 寻路算法, 主要学习了这篇文章, 但这篇翻译得不是很好, 我花了很久才看明白文章中的各种指代. 特写此篇博客用来总结, 并写了寻路算法的代码, 觉得有用的同学可以看看. 另外因为图片制作起来比较麻烦, 所以我用的是原文里的图片. 当…

玩转数据结构——均摊复杂度和防止复杂度的震荡(笔记)

数据规模 时间复杂度 并不是所有的双层循环都是O&#xff08;n^2&#xff09;的 复杂度实验来确定复杂度 // O(N) 两倍增加 int findMax( int arr[], int n ){assert( n > 0 );int res arr[0];for( int i 1 ; i < n ; i )if( arr[i] > res )res arr[i];return res…

解决:bash: vim: command not found、docker 容器不识别 vi / vim 、docker 容器中安装 vim

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 在 Docker 容器中编辑文件&#xff0c;报错如下&#xff1a; bash: vim: command not found2. 安装 vim &#xff1a; apt-get in…

怎样正确使用车灯?

当我们被对面来车明晃晃的远光灯照得意识模糊时&#xff0c;当你快速接近一辆摩托车却发现那是一辆坏了一盏尾灯的卡车时&#xff0c;或是当你前方的小车忽然亮起倒车灯却在往前行驶&#xff0c;最后意识到那只是因为刹车灯与倒车灯线路颠倒时&#xff0c;你就会发现在人们都认…