news 2026/10/26 22:30:40

STL - 函数对象

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STL - 函数对象

STL - 函数对象

一、函数对象
1.概念
  • 重载函数调用操作符的类,其对象常成为函数对象
  • 函数对象使用重载的()时,行为类似函数调用,也叫仿函数

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

2.函数对象使用

特点:

  • 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
  • 函数对象可以作为参数传递
//1 class MyAdd { public: int operator()(int v1, int v2) { return v1 + v2; } }; void test01() { //使用类创建对象,这里myAdd叫函数对象 MyAdd myAdd; cout << myAdd(7, 8) << endl;//15 //函数对象可以像函数一样调用 } //2 class MyPrint { public: MyPrint() { this->count = 0; } void operator()(string test) { cout << test << endl; this->count++; } int count;//记录状态,内部自己的状态 }; //有自己的状态 void test02() { MyPrint myPrint; myPrint("Hello! welcom to qingqingcaoyuan"); cout << "myPrint调用次数:"<<myPrint.count << endl; } //3.函数对象可以作为参数传递 void doPrint(MyPrint& mp, string test) { mp(test); } void test03() { MyPrint myPrint; doPrint(myPrint, "lanyy1"); }
二、谓词
1.概念
  • 返回bool类型的仿函数称为谓词
  • 如果operator()接受一个参数,那么叫做一元谓词
  • 如果operator()接受两个参数,那么叫做二元谓词
2.一元谓词
class GreaterFive { public: bool operator()(int val)//一元谓词 { return val > 6; } }; void test04() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } //查找容器中是否存在大于6的数字 //find_if,条件查找算法,返回的是一个迭代器 vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());//最后一个参数为匿名的函数对象,是我们要查找的条件 if (it == v.end()) { cout << "cannot find !" << endl; } else { cout << "find it ,the value is: " << *it << endl; } }

函数参数若是 pred 就代表这里需要填写一个谓词

3.二元谓词
class myCompare { public: bool operator()(int v1, int v2) { return v1 > v2; } }; void test05() { vector<int>v; v.push_back(7); v.push_back(8); v.push_back(3); v.push_back(6); v.push_back(5); sort(v.begin(), v.end());//默认升序排序 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; //改变排序规则,变为降序排序,使用函数对象(仿函数),将函数对象写在算法里面即可 sort(v.begin(), v.end(), myCompare());//类名不是函数对象,需要+(),才是一个对象(匿名对象) for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; }
三、内建函数对象
1.基本概念

概念:STL内建了一些函数对象

分类:算术仿函数、关系仿函数、逻辑仿函数

用法:

仿函数所产生的对象,用法和一般函数完全相同

使用内建函数对象,需要引入头文件#include<functional>

2.算术仿函数

实现四则运算;其中negate是一元运算(一个操作数),其他都是二元运算。仿函数原型:

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> //取反仿函数

使用示例:

void test06() { //取反 一元仿函数 negate<int>n;//数据类型为int,数据名为n cout << n(7) << endl; //二元仿函数 plus<int>m;//默认认为传入的都是同种类型,只允许同类型相加 cout << m(7, 8) << endl; //其余运算只需要改变plus即可 }
3.关系仿函数

实现关系对比的操作,函数原型:

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> //小于等于

示例:

void test07() { //举例大于greater vector<int>v; v.push_back(7); v.push_back(8); v.push_back(6); v.push_back(9); v.push_back(5); for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; //降序排序,默认排序是升序排序,想要降序排序,需要添加一个bool类型的谓词,默认是小于less //sort(v.begin(), v.end(), myCompare());//这是自己写的仿函数,其次可以使用编译器内建的仿函数 sort(v.begin(),v.end(),greater<int>());//greater<int>()是内建的仿函数 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; }
4.逻辑仿函数

实现逻辑运算,函数原型:

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

示例:

void test08() { //主要举例逻辑非 vector<bool>v; v.push_back(true); v.push_back(false); v.push_back(false); for (vector<bool>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; //利用逻辑非取反放入另一个容器中 vector<bool>v2; v2.resize( v.size());//一定要先指定空间大小 //使用特定函数进行转换放入 transform(v.begin(), v.end(), v2.begin(), logical_not<bool>()); //参数列表(原始容器区间开始,原始容器区间结束,新的容器开始,谓词(需要做什么操作)) for (vector<bool>::iterator it = v2.begin(); it != v2.end(); it++) { cout << *it << " "; } cout << endl; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 9:52:35

2月1日面试题整理

1. Java 有哪些锁 锁是为了解决并发问题中数据不一致问题 从乐观/悲观角度&#xff1a; 悲观锁&#xff1a; 认为冲突一定会发生&#xff0c;操作前先上锁。如 synchronized、ReentrantLock。 乐观锁&#xff1a; 认为冲突不常发生&#xff0c;更新时对比版本。如 CAS 算法、…

作者头像 李华
网站建设 2026/10/25 23:31:30

链表相关题目

链表相关题目 文章目录链表相关题目一、前言二、链表2.1 本质2.2 误区2.3 思路2.4 题型2.4.1 leetcode2.4.2 洛谷2.5 补充2.5.1 静态链表2.5.2 跳表三、小结一、前言 接下来就要进入基础数据结构部分了~ 二、链表 2.1 本质 链表就是把数据离散开 2.2 误区 头结点&#xff1…

作者头像 李华
网站建设 2026/10/24 13:10:46

2026抓住AI风口,飞上天!程序员、产品、项目经理、普通人转行大模型,看这篇就够了!转行AI大模型教程(建议收藏)

前言 在人工智能&#xff08;AI&#xff09;迅速发展的背景下&#xff0c;从传统的编程领域如Java程序员转向大模型开发是一个既充满挑战也充满机遇的过程。对于 Java 程序员来说&#xff0c;这也是一个实现职业转型、提升薪资待遇的绝佳机遇。 一、明确大模型概念 简单来说…

作者头像 李华
网站建设 2026/10/26 7:35:52

什么是Wi-Fi路由器

文章目录 Wi-Fi路由器兴起的背景Wi-Fi路由器是怎么工作的Wi-Fi路由器和AP的区别 Wi-Fi路由器是一台可以为本地用户提供无线接入且与外部网络通信的设备。其将有线网络信号转换成无线信号&#xff0c;以便于支持Wi-Fi功能的电脑、手机、Pad等设备接入网络&#xff0c;通常用于家…

作者头像 李华
网站建设 2026/10/26 7:42:15

**AI漫剧爆款生成器2025推荐,解锁高互动率与平台适配的

AI漫剧爆款生成器2025推荐&#xff0c;解锁高互动率与平台适配的创作新范式据《2025中国短视频与内容IP发展报告》显示&#xff0c;2025年国内AI漫剧市场规模预计突破180亿元&#xff0c;但能够同时满足“高产能输出”与“平台内容规范”的生成工具占比不足15%。量子探险2025年…

作者头像 李华