引言

函数对象是重载函数调用操作符的类,函数对象使用重载的()时,因为类似函数调用,也叫仿函数
所以仿函数(函数对象)就是一个类

我们可以自己建立函数对象,这里就不具体说了;STL中同样给我们提供了一些内建的函数对象,可以直接使用;
分为以下三种:

算术仿函数
关系仿函数
逻辑仿函数

这些仿函数的用法和一般的函数用法差不多相同,但是使用需要头文件#include<functional>

算术仿函数

几种常见的算术仿函数:

template<class T> T plus<T>          //加法仿函数
template<class T> T minus<T>         //减法仿函数
template<class T> T multiplies<T>    //乘法仿函数
template<class T> T divides<T>       //除法仿函数
template<class T> T modulus<T>       //取模仿函数
template<class T> T negate<T>        //取反仿函数

这里面只有negate是一元运算,其他都是二元运算,所以下面的示例代码我们就举 negate 和 multiplies 一个一元一个二元,二元用法都一样;
代码如下:

#include<iostream>
#include<functional>int main() {//取反仿函数 std::negate<int> n;std::cout << n(10) << std::endl;//乘法仿函数std::multiplies<int> m;std::cout << m(10, 10) << std::endl;return 0;
}

关系仿函数

关系仿函数的几种常见类型:

template<class T> bool equal_to<T>         //等于
template<class T> bool not_equal_to<T>     //不等于
template<class T> bool greater<T>          //大于
template<class T> bool greater_equal<T>    //大于等于
template<class T> bool less<T>             //小于
template<class T> bool less_equal<T>       //小于等于

这里面用的最多的其实是 greater,下面例子也是它的,其余的了解就行;
(这里记录 greater 也是为了 sort 从大到小排列节省步骤)
(一定要记住sort(vec.begin(), vec.end(), greater<int>());这个形式)
代码如下:

#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;//自己创建的仿函数
class MyCompare {public:bool operator() (int a, int b) {return a > b;}
};int main() {vector<int> vec;vec.push_back(20);vec.push_back(40);vec.push_back(10);vec.push_back(30);vec.push_back(90);//正常sort排序是从小到大sort(vec.begin(), vec.end());for (int i : vec) cout << i << ' '; cout << endl;//让sort从大到小排序方法:// 1,自己写个仿函数 // sort(vec.begin(), vec.end(), MyCompare());// 2,用STL的内建函数对象大于greater */ sort(vec.begin(), vec.end(), greater<int>());for (int i : vec) cout << i << ' '; cout << endl;return 0;
}

为了加深对sort理解,可以看一下sort实现的部分源码:

可以看到sort分别被定义了两种形式,第一种就是有三个参数,
这里我们主要看第二种两个参数,sort 默认从小到大排序的原理就在这里,
可以看到黄色部分是一个less<>(),这个不就是关系仿函数中的小于仿函数嘛;
所以sort才会默认从小到大
所以就能很好理解关系仿函数和sort了;

逻辑仿函数

逻辑仿函数没有什么说的,用的也不多,就罗列以下,以后要是用到了再补充;

template<class T> bool logical_and<T>              //逻辑与
template<class T> bool logical_or<T>               //逻辑或
template<class T> bool logical_not<T>              //逻辑非

总结

这里还是着重强调下算术仿函数和关系仿函数,尤其要记住关系仿函数中的greater<>(),同样要根深一层的理解sort;

内建函数对象(STL)相关推荐

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

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

  2. STL算法——内建函数对象

    文章目录 1 全部案例链接 2 内建函数对象 6个算数类函数对象,除了negate是一元运算,其他都是二元运算. 6个关系运算类函数对象,每一种都是二元运算. 逻辑运算类运算函数,not为一元运算,其 ...

  3. c++STL内建函数对象、仿函数——全面总结(附案例解析)(二十二)

    这里有C++STL--全面总结详细教程(附案例解析)(持续更新中) 内建函数对象 内建函数对象意义 概念: STL内建了一些函数对象 分类: 算术仿函数 关系仿函数 逻辑仿函数 用法: 这些仿函数所产 ...

  4. C++ 内建函数对象

    STL内建了一些函数对象.分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数.这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能.使用内建函数对象, ...

  5. 【C++】【第六篇-2】【黑马 p215~p242】【list容器】【set/multiset容器】【map/multimap容器】【函数对象】【谓词】【内建函数对象】

    [C++][第六篇-2][黑马 p215~p242][list容器][set/multiset容器][map/multimap容器][函数对象][谓词][内建函数对象] 3.7 list容器(p215 ...

  6. C++ 内建函数对象

    头文件<functional> 算数类函数对象 关系运算类函数对象 逻辑运算类仿函数

  7. [转]【C/C++】STL详解

      转载备用,原创作者在文章结尾... 文章目录 概述 STL六大组件简介 三大组件介绍 1. 容器 2. 算法 3. 迭代器 常用容器 1. string容器 string容器基本概念 string ...

  8. 【C/C++学习】之STL详解

    文章目录 概述 STL六大组件简介 三大组件介绍 容器 算法 迭代器 常用容器 1. string容器 string容器基本概念           string容器常用操作 2. vector容器 ...

  9. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

最新文章

  1. 2021年中国工业互联网安全大赛核能行业赛道writeup之hacker
  2. Codeforces Global Round 1 晕阙记
  3. oracle test就死,简单说明Oracle数据库中对死锁的查询及解决方法
  4. 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
  5. ViewPagerIndicator+viewpager的简单使用,不需要导入Library包
  6. MySQL Workbench运行脚本
  7. IOS--CALayer的介绍及使用技巧
  8. Rust性能分析-迭代器的enumerate方法是否会影响程序性能
  9. Java Web实训项目:西蒙购物网(2016)
  10. 如何用softmax和sigmoid来做多类分类和多标签分类
  11. 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图
  12. CF620E New Year Tree
  13. 平衡树(模板+文艺平衡树)
  14. 学习“用 深度卷积神经域 预测蛋白质二级结构”(1)
  15. mysql数据库创建删除带横杠的数据库名
  16. 数据结构教材答案(C语言版 严蔚敏)第一章 绪论
  17. RadSegNet: 一个稳定的雷达摄像头融合方法(2022最新)
  18. restrain java_Feign 在远端接口超时的时候,抑制异常的抛出
  19. 用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
  20. 微信小程序——订阅消息与微信公众号模板消息

热门文章

  1. filesaver.js 保存文件路径_iOS把UIImage保存到沙盒目录下以及沙盒目录概述
  2. 电脑显示器变色_流光溢彩电竞出击:飞利浦猛腾M1系列电竞显示器275M1RZ
  3. html5 规定input域,html5中关于input用法
  4. 云计算灾备:灾备通识
  5. 计算机设置从光盘启动怎么办,设置BIOS从光盘启动教程
  6. easyui表单网格列错位_《HTML5从入门到精通》——第3章 HTML表格与表单
  7. Docker:Docker的简介、安装、使用方法之详细攻略
  8. DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别、模型评估(99.4%)
  9. HaoheDI让ETL变得简单
  10. Arrays中sort部分源码阅读