函数对象

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得类对象可以像函数那样调用
注意:

  1. 函数对象(仿函数)是一个类,不是一个函数
  2. 函数对象(仿函数)重载"()“操作符使得它可以像函数一样调用
    分类:
    假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为**“一元仿函数**”,如果重载的operator()要求获取两个参数,就将这个类称为"二元仿函数
    函数对象的作用主要是什么?STL提供的算法往往都有两个版本,其中一个版本表现出最常用的某种运算,另一版本则允许用户通过template参数的形式来指定所要采取的策略

函数对象调用

#include<iostream>
using namespace std;class Myprint
{
public:void operator ()(int num){cout << "num" << num << endl;count++;}int count = 0;
};void MyPrint2(int num)
{cout << "num" << num << endl;
}void test01()
{//MyPrint是一个类,而不是函数Myprint myPrint;myPrint(111); //仿函数调用//MyPrint2(111);//函数调用Myprint()(1000);//匿名对象调用
}

函数对象超出了普通函数的概念,可以保存状态

//函数对象是一个类型,是由类中定义的,所有可以保存一些状态void  test02(){Myprint myPrint;myPrint(111);myPrint(111);myPrint(111);myPrint(111);cout << "myPrint使用次数:" << myPrint.count << endl;}

函数对象作为参数传递

void doPrint(Myprint print, int num)
{print(num);
}
void test03()
{doPrint(Myprint(), 20);}

总结

  1. 函数对象通常不定义构造函数和析构函数,所以在构造和析构时不会发生任何问题,避免了函数调用的运行时问题
  2. 函数对象超出普通函数的概念,函数对象可以有自己的状态
  3. 函数对象可内联函数,性能好,用函数指针几乎不可能
  4. 模板函数对象使函数对象具有通用性,这也是它的优势之一

谓词

谓词是指普通函数重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式

一元谓词

#include<iostream>using namespace std;
#include<vector>
#include<algorithm>class CreateThen20
{
public:bool operator()(int val){return val > 20;}
};//一元谓词
void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);//查找第一个大于20的数字//第三个参数 函数对象,匿名对象vector<int>::iterator pos= find_if(v.begin(), v.end(),CreateThen20());if (pos != v.end()){cout << "找到大于20的数字为:" << *pos << endl;}
}

二元谓词

class MyCompare
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};void test02()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);sort(v.begin(), v.end(), MyCompare());//匿名函数  lambda表达式 []函数名()参数{}实现体      [](int val){cout << val << " "; }for_each(v.begin(), v.end(), [](int val){cout << val << " "; });
}int main()
{//test01();test02();system("pause");return 0;
}

内建函数对象

STL内建一些函数对象。分为:算术类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数的功能,使用内建函数对象,需要引用头文件#include<functional>

算术函数对象

  1. 加法:plus plusstringAdd; sres=stringAdd(sva1,sva2);
  2. 减法:minus
  3. 乘法:multiplies
  4. 除法 divides
  5. 求余:modulus
  6. 取反:negate

关系函数对象

  1. 等于 equal_to equal_tostringEqual; sres=stringEqual(sval1,sval2);
  2. 不等于 not_equal_to
  3. 大于 greater
  4. 大于等于 greater_equal
  5. 小于 less
  6. 小于等于 less_equal

逻辑函数对象

  1. 逻辑与 logical_and logical_andindAnd; ires=intAnd(ival1,ival2); dres=BinaryFunc(logical_and(),dval1,dval2);

  2. 逻辑或 logical_or

  3. 逻辑非 logical_not logical_notIntNot; Ires=IntNot(ival1); Dres=UnaryFunc(logical_not,dval1);

    #include<iostream>using namespace std;
    //内建函数对象的头文件
    #include<functional>
    #include<vector>
    #include<algorithm>void test01()
    {//template<Class T>T negate<T>//取反仿函数negate<int>n;cout << n(10) << endl;//加法 template<Class T> T plus<T>//加法仿函数plus<int>p;cout << p(1, 1) << endl;
    }//template<Class T> bool greater<T>大于运算符
    void test02()
    {vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);sort(v.begin(), v.end(), greater<int>());for_each(v.begin(), v.end(), [](int val){cout << val << " "; });}int main()
    {//test01();test02();system("pause");return 0;
    }
    

c++中STL的常用算法--1(函数对象,谓词,内建函数对象)相关推荐

  1. c++中STL的常用算法---2(遍历算法,查找算法)

    算法概述 算法主要由头文件组成 是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等 体积很小,只包括在几个序列容器上进行的简单运算的模板函数 定 ...

  2. matlab的数值计算方法,数值计算方法中的一些常用算法的Matlab源码

    数值计算方法中的一些常用算法的Matlab源码,这些程序都是原创,传上来仅供大家参考,不足之处请大家指正,切勿做其它用途-- 说明:这些程序都是脚本函数,不可直接运行,需要创建函数m文件,保存时文件名 ...

  3. C++ STL【常用算法】详解

    大家好,欢迎来到STL[常用算法]详解模块,本文将对STL中常见但又高频的算法进行一个详细又简单的入门级教学

  4. html5怎么改为vue_是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型...

    点击上方"前端印象",选择"设为星标"第一时间关注技术干货! 引言 要理解本篇文章,必须具备JavaScript中基本数据类型和引用数据类型的概念,大家可以花两 ...

  5. c++中的STL的常用算法---3(排序算法,拷贝和替换算法,算术生成算法,集合算法)

    排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. #include<iostream>using namespace s ...

  6. java开发过程中几种常用算法

    排序算法 排序算法中包括:简单排序.高级排序 简单排序 简单排序常用的有:冒泡排序.选择排序.插入排序 冒泡排序代码如下: 1 private static void bubbleSrot(int[] ...

  7. 数据分析工作中excel最常用的八大函数

    文章目录 一.sum-求和 二.sumif-单条件求和 三.sumifs-多条件求和 四.subtotal-根据筛选求和 五.if-逻辑判断 六.vlookup-连接匹配数据 七.match-查找数值 ...

  8. vc++中几个常用的数学函数

    首先是头文件应该引用:cmath log()是表示以e为底的对数,在数学表达式中是ln,其中 e = 2.718281828459: 然后如果要是表示以a为底,b为指数的; log(b)/log(a) ...

  9. 编程中十大常用算法:(六)普里姆算法(最小生成树)

    背景 修路问题: (1)有七个村庄(A-G),现需要修路把7个村庄连通 (2)各个村庄的距离用边线(权值)表示,例如村庄A到村庄B的距离为5公里 求: 如何修路保证各个村庄都能连通,并且总的修建公路总 ...

最新文章

  1. ubuntu联网经常掉线的解决方法
  2. IDEA一定要懂的32条快捷键
  3. 在SQL Server中分页结果的最佳方法是什么
  4. 离散型随机变量及其分布列习题
  5. linux执行python命令后permission denied
  6. java vo转map_JAVA Map转换为Bean或VO
  7. Windows PowerShell:(2)基本操作
  8. oracle 改redo表空间,Oracle临时表空间查看、添加临时表空间数据文件、修改默认临时表空间 方法!...
  9. linux系统奔溃之vmcore:kdump 的亲密战友 crash
  10. Java面向对象封装和继承,java实现即时通讯的架构
  11. Web浏览器没有Flash如何播放RTMP协议直播
  12. Sublime Text安装及配置Python3
  13. Foxit PDF Creator注册码
  14. 显著性检验:P值和置信度
  15. redis数据库指令
  16. iOS 玩转微信——通讯录
  17. 高级端点保护 (AEP) 简介
  18. jsp学生学籍信息管理系统
  19. 2022年经历太多,大家都太艰难了,听一首悲伤的歌曲,代表现在的心情,送别老朋友
  20. 超支化共轭聚合物纳米粒子-具有水分散性/PLGA 纳米粒子载药

热门文章

  1. 洛谷2619/bzoj2654 Tree(凸优化+MST)
  2. Python API简单验证
  3. burpsuite破解版
  4. python web开发-flask访问请求数据request
  5. 【C/C++开发】C语言实现函数可变参数
  6. 分享下自己编译 XBMC 的过程(zhuan)
  7. 每天自动给自己发天气预报的脚本
  8. More Effective C++ (运算符)
  9. 逝去的大学生活自己丢了什么
  10. 各种说明方法的答题格式_语文万能答题公式,给孩子收藏吧!