当前位置: 首页 > news >正文

【C++】STL -- 仿函数的定义与使用

本篇文章主要讲解仿函数的定义及其使用


目录

1  仿函数的定义

2  仿函数的使用

3  总结


1  仿函数的定义

        所谓的仿函数,其实就是在一个类里面重载了 () 这个运算符,所以看上去就像使用了函数一样,其实是该类调用了 operator() 这个函数,如:

#include<iostream>using namespace std;template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};int main()
{//创建一个仿函数类的对象Greater<int> g1;//看上去像是函数调用,其实是 g1.operator()(1, 2)cout << g1(1, 2) << endl;int x = 1, y = 2;cout << g1(x, y) << endl;return 0;
}

输出结果:

0
0

2  仿函数的使用

        其实在 C++ 中,本来就为我们定义了两个仿函数的类,分别是 greater<T> 和 less<T>:

#include<iostream>using namespace std;int main()
{greater<int> g1;less<int> l1;cout << g1(1, 2) << endl;cout << l1(1, 2) << endl;return 0;
}

输出结果:

0
1

C++ 中仿函数的存在,其实就是 C 语言中普通函数的优化,比起普通函数,其本质就是用类来封装函数的行为,这就使得类似于函数的仿函数有了类的一些特性,比如继承与多态等等,当然其存在就是更多是为了满足 STL 的需求与实现 lambda 匿名函数(这里先不讲解匿名函数)。我们就通过一个算法库中的 sort 排序函数来讲解仿函数的使用。

sort 函数

sort 函数底层使用的是快速排序,并且其在 algorithm 头文件下,使用之前要包含一下;sort 有两个重载,前两个参数都是一个容器的迭代器范围(数组的指针也可以),最后一个参数默认是 less<T>(),所以 sort 函数默认是升序排序的,如果你想要实现降序排序,就可以传 greater<T>():

#include<iostream>
#include<algorithm>
#include<vector>using namespace std;int main()
{vector<int> v1 = { 1, 3, 2, 5, 9, 7, 6, 10 };//默认是升序排序sort(v1.begin(), v1.end());for (auto& x : v1)cout << x << ' ';cout << endl;//如果想要实现降序,那就传 greater<int>()sort(v1.begin(), v1.end(), greater<int>());for (auto& x : v1)cout << x << ' ';cout << endl;//数组也可以进行排序和范围 forint arr[] = { 1, 3, 2, 5, 9, 7, 6, 10 };size_t n = sizeof(arr)/sizeof(arr[0]);sort(arr, arr + n);for (auto& x : arr)cout << x << ' ';cout << endl;return 0;
}

输出结果:

1 2 3 5 6 7 9 10
10 9 7 6 5 3 2 1
1 2 3 5 6 7 9 10

        当然,在 sort 函数中你也可以传自己写的一个仿函数:

#include<iostream>
#include<algorithm>
#include<vector>using namespace std;template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};int main()
{vector<int> v1 = { 1, 3, 2, 5, 9, 7, 6, 10 };sort(v1.begin(), v1.end(), Greater<int>());for (auto& x : v1)cout << x << ' ';cout << endl;return 0;
}

输出结果:

10 9 7 6 5 3 2 1

3  总结

        仿函数虽然作为 STL 六大组件之一,但是其本身并不是特别复杂,学起来还是比较简单的。仿函数并不是一个单独的模块,主要是为了 STL 中其他组件服务的;另外,仿函数还弥补了 C 语言中函数的一些缺点,是函数的优化版本。

http://www.dtcms.com/a/427143.html

相关文章:

  • Linux新环境安装solana开发所需全部套件(持续更新)
  • 一个高性能的HTTP和反向代理服务器:Nginx
  • 人工智能客服应用如何重塑电商服务生态?智能AI软件带来的三大变革
  • 网站建设的注意学校网站开发方案模板
  • 分布式架构初识:为什么需要分布式
  • asp网站用ftp怎么替换图片办公室oa管理系统
  • 个性化的个人网站广州企业开办一网通
  • Transformer(一)---背景介绍及架构介绍
  • 【完整源码+数据集+部署教程】气动铣刀型号分类图像分割系统: yolov8-seg-C2f-SCConv
  • 【Android】强制使用 CPU 大核或超大核
  • 【算法竞赛学习笔记】基础概念篇:算法复杂度
  • SLA操作系统双因素认证实现Windows远程桌面OTP双因子安全登录—从零搭建企业级RDP安全加固体系
  • 现在主流的网站开发语言360房产网郑州官网
  • 石家庄哪个公司做网站好做外贸c2c网站有哪些
  • 伪路径约束
  • 新天力:以全链协同能力构筑食品容器行业领军优势
  • Markdown转换为Word:Pandoc模板使用指南
  • Cloudflare 开源 VibeSDK:开启“氛围编程”新时代的全栈 AI 应用生成平台
  • 汕头网站建设sagevis企业网站建设有什么好处
  • C语言趣味小游戏----猜数字小游戏
  • 多表关联对集中式数据库和分布式数据库系统冲击
  • Suifest 2025 活动速递
  • 交叉熵损失函数和负对数似然损失函数 KL散度
  • 坪地网站建设教程网站seo优化方法
  • 网站数据库多大合适成都小型软件开发公司
  • Gibbs采样:全面解析马尔可夫链蒙特卡洛的核心算法
  • 【开题答辩全过程】以 python的音乐网站为例,包含答辩的问题和答案
  • 二项式定理——力扣2221.数组的三角和
  • 【数据结构】快速排序与归并排序的实现
  • LeetCode算法日记 - Day 57: 括号生成、组合