24. 函数符
函数对象函数对象函数符 functor函数对象也叫函数符functor是可以以函数方式与 () 结合使用的任意对象。这包括函数名、指向函数的指针以及重载了 () 运算符的类对象即定义了 operator()() 的类。例如定义一个 Linear 类重载的 () 运算符使得能够像函数那样使用 Linear 对象f1(12.5) 的右侧就是 f1.operator()(12.5)。class Linear { // 函数符类重载 () 运算符 private: double slope; // 斜率由构造函数设置 double y0; // 截距由构造函数设置 public: Linear(double sl, double y) // 构造函数绑定状态 : slope(sl), y0(y) {} double operator()(double x) { // 重载 ()使对象可像函数调用 return y0 slope * x; // x 来自调用参数 } }; // Linear f1(1.0, 0.0); double y1 f1(12.5); // 计算 0 1*12.5for_each 的第三个参数与模板机制for_each 本质上就是一个“包装好的 for 循环”它负责从头到尾遍历容器并把每个元素依次传递给你提供的函数或函数对象去执行。for_each() 的第三个参数可以是常规函数也可以是函数符。for_each( 起始位置, 结束位置, 函数/对象 );不能把它声明为函数指针因为函数指针指定了参数类型由于容器可以包含任意类型预先无法知道应使用哪种参数类型。STL 通过使用模板解决这个问题其原型为template class InputIterator, class Function Function for_each(InputIterator first, InputIterator last, Function f);// for_each 的原型Function 可为函数指针或函数符类 template class InputIterator, class Function Function for_each(InputIterator first, InputIterator last, Function f) { while (first ! last) { // 遍历整个区间 f(*first); // 对每个元素调用 f first; } return f; // 返回函数对象 }函数符概念generator / unary / binary / predicate函数符概念Generator / Unary / Predicate是 STL 算法对“传入参数个数”和“返回值类型”的一种“硬性接口约定”。生成器generator是不用参数就可以调用的函数符一元函数unary function是用一个参数可以调用的函数符二元函数binary function是用两个参数可以调用的函数符谓词predicate是返回 bool 值的一元函数二元谓词binary predicate是返回 bool 值的二元函数。如 for_each() 的函数符应当是一元函数因为它每次用于一个容器元素一些 STL 函数需要谓词参数或二元谓词参数。remove_if 与类函数符传递额外信息形态用法是否真的释放内存改变容器大小后续必须做的事通用算法头文件algorithmstd::remove_if(v.begin(), v.end(), pred)❌否。它只是把“被删的元素”挪到末尾把“保留的元素”挪到前面容器大小不变。必须配合erase()才能真正删除即Erase-Remove 惯用法。list成员函数头文件listmy_list.remove_if(pred)✅是。链表节点被直接销毁list的大小自动变小。不需要任何后续操作。算法限制remove_if 只能接受一元谓词一个参数用于接收当前遍历到的元素。信息瓶颈普通函数只能写死阈值无法动态传入第二个参数。解决方法函数符利用类成员变量如 cutoff携带“额外信息”。构造函数负责设置规则operator() 负责结合元素和规则做出判断。template class T class TooBig { // 类函数符用成员携带额外信息 private: T cutoff; // 取舍值由构造函数设置 public: TooBig(const T t) : cutoff(t) {} // 构造函数绑定阈值 bool operator()(const T v) { // 谓词单个参数 return v cutoff; // 判断是否大于阈值 } }; // scores.remove_if(TooBigint(200)); // 删除所有大于 200 的元素类函数符作为函数适配器TooBig2如果已经有一个接受两个参数的模板函数 tooBig(val, lim)可以用类将它转换为单参数的函数对象——TooBig2 类把第二个参数用于构建函数对象operator() 内部调用二元模板函数并传入已绑定的 cutoff。template class T bool tooBig(const T val, const T lim) { // 已有的二元模板函数 return val lim; } ​ template class T class TooBig2 { // 函数适配器二元→一元 private: T cutoff; // 绑定的第二个参数 public: TooBig2(const T t) : cutoff(t) {} bool operator()(const T v) { // 单参数接口 return tooBigT(v, cutoff); // 内部调用二元函数 } }; // TooBig2int tB100(100); if (tB100(x)) // 等价于 if (tooBig(x, 100))transform() 算法transform() 算法用于对一个或两个输入区间中的每个元素执行指定操作并将计算结果写入目标区间实现“批量转换”。一元将一个区间中的每个元素通过一元函数op转换输出到另一个区间。template class InputIt, class OutputIt, class UnaryOp OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOp op);参数含义first1, last1输入区间的起点和终点d_first目标区间的起点输出结果op一元函数符接收一个元素返回转换后的值#include algorithm #include vector ​ std::vectorint src {1, 2, 3, 4}; std::vectorint dst(4); // 预留空间 ​ // 把 src 中的每个元素平方存入 dst std::transform(src.begin(), src.end(), dst.begin(), [](int x) { return x * x; }); // dst 变为 {1, 4, 9, 16}二元版将两个区间中对应位置的元素通过二元函数 binary_op 结合输出到目标区间。template class InputIt1, class InputIt2, class OutputIt, class BinaryOp OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOp binary_op);参数含义first1, last1第一个输入区间的起点和终点first2第二个输入区间的起点长度由第一个区间决定d_first目标区间的起点binary_op二元函数符接收两个元素返回结合后的值std::vectorint a {1, 2, 3}; std::vectorint b {10, 20, 30}; std::vectorint result(3); ​ // 把 a 和 b 的对应元素相加存入 result std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](int x, int y) { return x y; }); // result 变为 {11, 22, 33}注意第二个输入区间必须至少有 last1 - first1 个元素否则行为未定义。目标迭代器可以等于输入迭代器实现“原地修改”。预定义的函数符头文件 functional预定义函数符是“运算符的‘函数对象’包装器”。因为STL 算法的参数是“对象”而不是“符号”。分类函数符名称对应的运算符中文含义算术plusT加法minusT-减法multipliesT*乘法dividesT/除法modulusT%取模余数negateT-一元取负如-5比较关系equal_toT等于not_equal_toT!不等于greaterT大于lessT小于greater_equalT大于等于less_equalT小于等于逻辑logical_andT逻辑与logical_orT||逻辑或logical_notT!逻辑非自适应函数符adaptable functor与函数适配器STL 有 5 个相关概念自适应生成器adaptable generator、自适应一元函数adaptable unary function、自适应二元函数adaptable binary function、自适应谓词adaptable predicate和自适应二元谓词adaptable binary predicate。使函数符成为自适应的原因是它携带了标识参数类型和返回类型的 typedef 成员result_type、first_argument_type和second_argument_type如plusint对象的返回类型被标识为plusint::result_type。binder1st它的数学本质是“固定二元函数的一个参数把它变成一元函数。”它把2.5“绑定”到multiplies的第一个参数上生成一个新的临时对象。这个新对象只需要接收一个参数x内部执行2.5 * x。现代 CC11 起中它已经被 Lambda 表达式和 std::bind 彻底取代了。知识点描述函数对象函数符可以函数方式与()结合使用的对象函数名、函数指针、重载()的类对象类函数符用构造函数保存状态x来自operator()参数。for_each 第三参数与模板第三参数不能声明为函数指针参数类型不确定用模板参数Function同时接受函数指针与函数符类for_each内部用f()统一调用。函数符概念生成器无参数、一元函数一个参数、二元函数两个参数、谓词返回 bool 的一元函数、二元谓词返回 bool 的二元函数for_each需要一元函数。remove_if 与类函数符list::remove_if(predicate)对每个元素应用谓词返回 true 则删除谓词只能一个参数用类成员构造函数设置 cutoff传递额外信息。类函数符作为函数适配器用类把二元模板函数转换为单参数函数对象第二参数由构造函数绑定、operator()内部调用二元函数TooBig2是函数适配器使函数满足不同接口。transform() 算法一元版对区间每元素施加函数符生成新序列二元版对两个区间对应元素施加二元函数目标迭代器可在原区间内覆盖旧值。预定义的函数符functional提供与内置算术/关系/逻辑运算符等价的函数符plus、multiplies、greater 等因运算符不是函数用plusdouble()等作为算法参数老式实现用times代替multiplies。自适应函数符与函数适配器自适应函数符携带result_type、first_argument_type、second_argument_typetypedefbinder1st/binder2nd将自适应二元函数适配为一元绑定第一/第二参数助手函数bind1st()/bind2nd()简化创建。

相关新闻

Vue4.0:开发进度、核心升级与未来特性全景解析

Vue4.0:开发进度、核心升级与未来特性全景解析

本文基于 2026 Vue&ViteConf 官方官宣,精准解答:Vue4.0 是否真的启动开发、和 Vue3.6 的关系、核心革命性升级、开发者最值得期待的特性,同时破除网络谣言,适配面试、技术选型、前端进阶学习。一、核心答案:Vue4.0…

2026/8/11 11:13:06 阅读更多 →
23.泛型编程下

23.泛型编程下

复杂度(complexity) 复杂度描述了执行操作所需的时间,有三种可能性,从快到慢依次为: 编译时间(compile time):操作在编译时执行,执行时间为 0; 固定时间&am…

2026/8/11 11:13:06 阅读更多 →
苹果ASA广告只显示文字、不展示图片问题详解

苹果ASA广告只显示文字、不展示图片问题详解

很多开发者和投放客户都会遇到同一个疑惑:苹果搜索广告(ASA)时而展示带APP截图的图片版广告,时而只显示图标和文字,没有任何图片素材。大家普遍误以为是账号故障、素材失效、投放出错,其实这是苹果官方固定…

2026/8/11 11:13:05 阅读更多 →

最新新闻

AI建站工具解析:零门槛打造专业网站的四大技术支柱

AI建站工具解析:零门槛打造专业网站的四大技术支柱

1. 项目概述:AI建站工具如何让网站搭建零门槛 十年前要搭建一个网站,你得懂HTML/CSS、会配置服务器、还得研究数据库。现在只要会打字,就能用AI建站工具在半小时内做出专业级网站。这不是魔法,而是AI技术带来的生产力革命。 目前…

2026/8/11 12:37:42 阅读更多 →
终极Wand增强工具:免费解锁完整游戏修改体验的终极方案

终极Wand增强工具:免费解锁完整游戏修改体验的终极方案

终极Wand增强工具:免费解锁完整游戏修改体验的终极方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一款专为Wand&a…

2026/8/11 12:37:42 阅读更多 →
Super IO:用复制粘贴彻底改变你的Blender 3D工作流程

Super IO:用复制粘贴彻底改变你的Blender 3D工作流程

Super IO:用复制粘贴彻底改变你的Blender 3D工作流程 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 还在为Blender繁琐的导入导出操作而烦恼吗?每次都要点击&q…

2026/8/11 12:37:42 阅读更多 →
Claude AI助手使用全攻略:从基础到高阶技巧

Claude AI助手使用全攻略:从基础到高阶技巧

1. Claude 使用入门指南 Claude是当前最受关注的AI助手之一,它以强大的自然语言处理能力和友好的交互体验著称。作为一名AI工具深度使用者,我在过去半年里几乎每天都会与Claude进行各种类型的对话交互。今天就来分享我的完整使用心得,从基础操…

2026/8/11 12:37:42 阅读更多 →
OpenAI暂停Astra项目:AI网络安全能力触及“严重”阈值的警示与应对

OpenAI暂停Astra项目:AI网络安全能力触及“严重”阈值的警示与应对

这次我们来看一个关于AI安全能力边界的重要事件。OpenAI近期暂停了其内部项目Astra的部分工作,原因是其网络安全能力可能已经达到了一个“严重”的阈值。这并非一个可以直接部署的本地模型或工具,而是一个关于AI安全治理、能力评估与风险控制的深度技术议…

2026/8/11 12:37:42 阅读更多 →
GPT Mini v5.0实战:Vibe Coding与GPT Codex集成,重塑AI编程工作流

GPT Mini v5.0实战:Vibe Coding与GPT Codex集成,重塑AI编程工作流

最近在尝试将 AI 编程助手深度集成到开发工作流中时,发现市面上的工具要么功能单一,要么配置复杂,难以实现“随时随地、沉浸式”的编码体验。直到体验了 GPT Mini 的最新 v5.0 大版本,其核心的 Vibe Coding 模式和集成的 GPT C…

2026/8/11 12:36:42 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →