c++中STL的常用算法--1(函数对象,谓词,内建函数对象)
函数对象
重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得类对象可以像函数那样调用
注意:
- 函数对象(仿函数)是一个类,不是一个函数
- 函数对象(仿函数)重载"()“操作符使得它可以像函数一样调用
分类:
假定某个类有一个重载的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);}
总结
- 函数对象通常不定义构造函数和析构函数,所以在构造和析构时不会发生任何问题,避免了函数调用的运行时问题
- 函数对象超出普通函数的概念,函数对象可以有自己的状态
- 函数对象可内联函数,性能好,用函数指针几乎不可能
- 模板函数对象使函数对象具有通用性,这也是它的优势之一
谓词
谓词是指普通函数或重载的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>
算术函数对象
- 加法:plus plusstringAdd; sres=stringAdd(sva1,sva2);
- 减法:minus
- 乘法:multiplies
- 除法 divides
- 求余:modulus
- 取反:negate
关系函数对象
- 等于 equal_to equal_tostringEqual; sres=stringEqual(sval1,sval2);
- 不等于 not_equal_to
- 大于 greater
- 大于等于 greater_equal
- 小于 less
- 小于等于 less_equal
逻辑函数对象
逻辑与 logical_and logical_andindAnd; ires=intAnd(ival1,ival2); dres=BinaryFunc(logical_and(),dval1,dval2);
逻辑或 logical_or
逻辑非 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(函数对象,谓词,内建函数对象)相关推荐
- c++中STL的常用算法---2(遍历算法,查找算法)
算法概述 算法主要由头文件组成 是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等 体积很小,只包括在几个序列容器上进行的简单运算的模板函数 定 ...
- matlab的数值计算方法,数值计算方法中的一些常用算法的Matlab源码
数值计算方法中的一些常用算法的Matlab源码,这些程序都是原创,传上来仅供大家参考,不足之处请大家指正,切勿做其它用途-- 说明:这些程序都是脚本函数,不可直接运行,需要创建函数m文件,保存时文件名 ...
- C++ STL【常用算法】详解
大家好,欢迎来到STL[常用算法]详解模块,本文将对STL中常见但又高频的算法进行一个详细又简单的入门级教学
- html5怎么改为vue_是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型...
点击上方"前端印象",选择"设为星标"第一时间关注技术干货! 引言 要理解本篇文章,必须具备JavaScript中基本数据类型和引用数据类型的概念,大家可以花两 ...
- c++中的STL的常用算法---3(排序算法,拷贝和替换算法,算术生成算法,集合算法)
排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. #include<iostream>using namespace s ...
- java开发过程中几种常用算法
排序算法 排序算法中包括:简单排序.高级排序 简单排序 简单排序常用的有:冒泡排序.选择排序.插入排序 冒泡排序代码如下: 1 private static void bubbleSrot(int[] ...
- 数据分析工作中excel最常用的八大函数
文章目录 一.sum-求和 二.sumif-单条件求和 三.sumifs-多条件求和 四.subtotal-根据筛选求和 五.if-逻辑判断 六.vlookup-连接匹配数据 七.match-查找数值 ...
- vc++中几个常用的数学函数
首先是头文件应该引用:cmath log()是表示以e为底的对数,在数学表达式中是ln,其中 e = 2.718281828459: 然后如果要是表示以a为底,b为指数的; log(b)/log(a) ...
- 编程中十大常用算法:(六)普里姆算法(最小生成树)
背景 修路问题: (1)有七个村庄(A-G),现需要修路把7个村庄连通 (2)各个村庄的距离用边线(权值)表示,例如村庄A到村庄B的距离为5公里 求: 如何修路保证各个村庄都能连通,并且总的修建公路总 ...
最新文章
- ubuntu联网经常掉线的解决方法
- IDEA一定要懂的32条快捷键
- 在SQL Server中分页结果的最佳方法是什么
- 离散型随机变量及其分布列习题
- linux执行python命令后permission denied
- java vo转map_JAVA Map转换为Bean或VO
- Windows PowerShell:(2)基本操作
- oracle 改redo表空间,Oracle临时表空间查看、添加临时表空间数据文件、修改默认临时表空间 方法!...
- linux系统奔溃之vmcore:kdump 的亲密战友 crash
- Java面向对象封装和继承,java实现即时通讯的架构
- Web浏览器没有Flash如何播放RTMP协议直播
- Sublime Text安装及配置Python3
- Foxit PDF Creator注册码
- 显著性检验:P值和置信度
- redis数据库指令
- iOS 玩转微信——通讯录
- 高级端点保护 (AEP) 简介
- jsp学生学籍信息管理系统
- 2022年经历太多,大家都太艰难了,听一首悲伤的歌曲,代表现在的心情,送别老朋友
- 超支化共轭聚合物纳米粒子-具有水分散性/PLGA 纳米粒子载药