内建函数对象(STL)
引言
函数对象是重载函数调用操作符的类,函数对象使用重载的()时,因为类似函数调用,也叫仿函数
所以仿函数(函数对象)就是一个类
我们可以自己建立函数对象,这里就不具体说了;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)相关推荐
- c++中STL的常用算法--1(函数对象,谓词,内建函数对象)
函数对象 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得 ...
- STL算法——内建函数对象
文章目录 1 全部案例链接 2 内建函数对象 6个算数类函数对象,除了negate是一元运算,其他都是二元运算. 6个关系运算类函数对象,每一种都是二元运算. 逻辑运算类运算函数,not为一元运算,其 ...
- c++STL内建函数对象、仿函数——全面总结(附案例解析)(二十二)
这里有C++STL--全面总结详细教程(附案例解析)(持续更新中) 内建函数对象 内建函数对象意义 概念: STL内建了一些函数对象 分类: 算术仿函数 关系仿函数 逻辑仿函数 用法: 这些仿函数所产 ...
- C++ 内建函数对象
STL内建了一些函数对象.分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数.这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能.使用内建函数对象, ...
- 【C++】【第六篇-2】【黑马 p215~p242】【list容器】【set/multiset容器】【map/multimap容器】【函数对象】【谓词】【内建函数对象】
[C++][第六篇-2][黑马 p215~p242][list容器][set/multiset容器][map/multimap容器][函数对象][谓词][内建函数对象] 3.7 list容器(p215 ...
- C++ 内建函数对象
头文件<functional> 算数类函数对象 关系运算类函数对象 逻辑运算类仿函数
- [转]【C/C++】STL详解
转载备用,原创作者在文章结尾... 文章目录 概述 STL六大组件简介 三大组件介绍 1. 容器 2. 算法 3. 迭代器 常用容器 1. string容器 string容器基本概念 string ...
- 【C/C++学习】之STL详解
文章目录 概述 STL六大组件简介 三大组件介绍 容器 算法 迭代器 常用容器 1. string容器 string容器基本概念 string容器常用操作 2. vector容器 ...
- 笔记②:牛客校招冲刺集训营---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 友元 友 ...
最新文章
- 2021年中国工业互联网安全大赛核能行业赛道writeup之hacker
- Codeforces Global Round 1 晕阙记
- oracle test就死,简单说明Oracle数据库中对死锁的查询及解决方法
- 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
- ViewPagerIndicator+viewpager的简单使用,不需要导入Library包
- MySQL Workbench运行脚本
- IOS--CALayer的介绍及使用技巧
- Rust性能分析-迭代器的enumerate方法是否会影响程序性能
- Java Web实训项目:西蒙购物网(2016)
- 如何用softmax和sigmoid来做多类分类和多标签分类
- 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图
- CF620E New Year Tree
- 平衡树(模板+文艺平衡树)
- 学习“用 深度卷积神经域 预测蛋白质二级结构”(1)
- mysql数据库创建删除带横杠的数据库名
- 数据结构教材答案(C语言版 严蔚敏)第一章 绪论
- RadSegNet: 一个稳定的雷达摄像头融合方法(2022最新)
- restrain java_Feign 在远端接口超时的时候,抑制异常的抛出
- 用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
- 微信小程序——订阅消息与微信公众号模板消息
热门文章
- filesaver.js 保存文件路径_iOS把UIImage保存到沙盒目录下以及沙盒目录概述
- 电脑显示器变色_流光溢彩电竞出击:飞利浦猛腾M1系列电竞显示器275M1RZ
- html5 规定input域,html5中关于input用法
- 云计算灾备:灾备通识
- 计算机设置从光盘启动怎么办,设置BIOS从光盘启动教程
- easyui表单网格列错位_《HTML5从入门到精通》——第3章 HTML表格与表单
- Docker:Docker的简介、安装、使用方法之详细攻略
- DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别、模型评估(99.4%)
- HaoheDI让ETL变得简单
- Arrays中sort部分源码阅读