STL-函数对象
发布日期:2021-11-20 10:17:59 浏览次数:17 分类:技术文章

本文共 2106 字,大约阅读时间需要 7 分钟。

1.函数对象的概念:

重载函数调用操作符的类,其对象常称为函数对象
函数对象使用重载的()时,行为类似函数调用,也叫仿函数

本质:函数对象(仿函数)是一个类,不是一个函数

2.函数对象的特点:

函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。

函数对象超出普通函数的概念,函数对象可以有自己的状态。
函数对象可以作为参数传递。

#include "pch.h"#include 
#include
#include
#include
#include
using namespace std;//函数对象class myadd {
public: int operator()(int v1,int v2) {
return v1 + v2; }};void test01() {
myadd myadd;//创建函数对象 cout << myadd(10, 10) << endl;}

谓词:

概念:
1,。返回bool类型的仿函数称为谓词
2.如果operator()接受一个参数,那么叫做一元谓词
3.如果operator()接受两个参数,那么叫做二元谓词

//仿函数 一元谓词class greaterfive {
public: bool operator()(int val) {
return val > 5; }};void test02() {
vector
v; for (int i = 0; i < 10; i++) {
v.push_back(i); } //查找容器中有没有大于5的 //greaterfive()为匿名的函数对象 vector
::iterator it = find_if(v.begin(), v.end(), greaterfive()); if (it == v.end) {
cout << "未找到" << endl; } else {
cout << "找到了大于5的数字" << endl; }}
//二元谓词class compare {
public: bool operator()(int val1,int val2) {
return val1 > val2; }};void test03() {
vector
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(), compare()); }

内建函数对象

STL内建 了一些函数对象

分类:

算术仿函数 四则运算
原型:
template T plus 加
template T minus 减
template T multiplies 乘
template T divides 除
template T modulus 求模
template T negate 取反 一元

/算术仿函数//negate一元仿函数,取反//plus 二元仿函数void test04() {
negate
n; n(50);//对50取反 plus
p; p(10, 10);}

关系仿函数 大于小于

函数原型:

template bool equal_to 等于
template bool not_equal_to 不等于
template bool greater 大于
template bool greater_equal 大于等于
template bool less 小于
template bool less_equal 小于等于

//关系仿函数void test03() {
vector
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(), greater
());}

逻辑仿函数 与或非

template bool logical_and 与
template bool logical_or 或
template bool logical_not 非

用法

这些仿函数所产生的对象,用法和一般函数完全相同
使用内建函数对象,需要引入头文件#include

转载地址:https://blog.csdn.net/weixin_43223362/article/details/103283786 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:STL-常用遍历算法
下一篇:map容器以及下标操作和insert操作

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月01日 00时03分50秒