25. 算法上
算法算法设计的两个通用部分对于算法函数设计有两个主要的通用部分它们都使用模板来提供泛型它们都使用迭代器来提供访问容器中数据的通用表示。模板解决了“存储什么类型”的问题。迭代器解决了“数据怎么存放”的问题。因为指针是一种特殊的迭代器所以 copy() 等 STL 函数可用于常规数组统一的容器设计使得不同类型的容器之间具有明显关系——可用 copy() 把数组值复制到 vector、把 vector 值复制到 list、把 list 值复制到 set可用 比较不同类型的容器如 deque 和 vector因为容器重载的 运算符使用迭代器比较内容只要内容与排列顺序相同即相等。// 算法设计的两个通用部分模板提供泛型、迭代器提供通用访问 template class InputIterator, class OutputIterator OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result); // 同一 copy 算法可用于double 数组、string 链表、set 树结构算法组的四种分类STL 将算法库分成 4 组非修改式序列操作non-modifying sequence operations遍历区间但不修改容器元素的值也不改动元素的顺序。find、count、for_each注、equal修改式序列操作mutating sequence operations会修改元素的值或者改变元素的位置/顺序。copy、remove、reverse、transform、fill排序和相关操作sorting and related operations专门针对顺序做文章排序、归并、集合运算、二分查找。sort、merge、set_union、lower_bound通用数字运算generalized numeric operations专治各种数学计算累加、内积、差分。accumulate、inner_product、adjacent_difference前 3 组在头文件 algorithm以前为 algo.h中描述第 4 组专用于数值数据有自己的头文件 numeric以前它们也位于 algo.h 中。算法原型的迭代器假设常写template class T这里的T没有任何含义随便换成U都行。但在 STL 中模板参数名是有特殊意义的。例如templateclass InputIterator, class OutputIteratorInputIterator输入迭代器OutputIterator输出迭代器编译器不会像检查 int 或 class 那样去验证“你是不是一个输入迭代器”它没有专门的内置类型叫 InputIterator。如果sort内部写了一句it 5;随机访问才支持的操作。此时编译器检查listint::iterator是否有operator。结果没有。编译器报错。就地算法与复制算法copy 后缀约定就地算法In-place直接在原始数据上动手。原件被销毁/覆盖节省内存。复制算法Copying algorithm从头到尾不动原件把修改后的结果放到另一个地方。原件完好无损。命名规则STL 的约定是如果某个算法通常就地修改数据但你想保留原件就调用它的_copy版本。_copy版本总是多一个参数用来指定“结果放哪”输出迭代器。transform() 可以以两种方式完成工作——与 copy() 相似用输出迭代器指示结果存储位置但允许输出迭代器指向输入区间因此可用计算结果覆盖原来的值。有些算法有两个版本就地版本和复制版本STL 的约定是复制版本的名称以 copy 结尾并接受一个额外的输出迭代器参数指定结果的放置位置。特例transform 可以“以两种方式完成工作”。因为 transform 本身就要求你传一个输出迭代器copy 版的特性。但它允许你把输出迭代器设为输入区间的起点即 dst src这样它就变成了“就地”算法。复制算法统一的约定是返回一个迭代器该迭代器指向复制的最后一个值后面的一个位置如 replace_copy() 的返回类型为 OutputIterator。if 后缀与谓词变体无 _if如 replace只认准一个具体的值。比如“把所有等于 2 的换成 99”。带 _if如 replace_if不管具体值是多少只问是或不是。比如“把所有大于 10 的换成 99”、“把所有偶数换成 99”。STL 与 string 类string 类虽然不是 STL 的组成部分但设计它时考虑到了 STL——它包含 begin()、end()、rbegin() 和 rend() 等成员因此可以使用 STL 接口。next_permutation按“字典序字母表顺序”生成下一个排列。成功该算法返回 true如果区间已经处于最后的序列中则该算法返回 false。要得到区间内容的所有排列组合应从最初的顺序开始先排序。#include string // string 提供 begin/end 等成员 #include algorithm // next_permutation 所在头文件 std::string letters(awl); // 先用 sort(letters.begin(), letters.end()); 得到最初顺序 // while (next_permutation(letters.begin(), letters.end())) // 每次调用转换为下一种字母递增排列已是最后序列时返回 false函数方法与容器方法的取舍使用 STL 方法或 STL 函数通常方法是更好的选择首先它更适合于特定的容器其次作为成员函数它可以使用模板类的内存管理工具从而在需要时调整容器的长度。尽管方法通常更适合但非方法函数更通用使用 STL组件协同工作典型综合用法用 vectorstring 按输入顺序保存单词用 setstring 自动排序并去重配合 transform() 与插入迭代器、转换函数把单词转为小写用 mapstring, int 把单词与其出现次数关联用 count() 统计每个词在 vector 中出现的次数。// 组件协同vector 保序、set 排序去重、map 计数 std::vectorstd::string words; // 按输入顺序保存 std::setstd::string wordset; // 自动排序、键唯一 std::mapstd::string, int wordmap; // 键单词→ 值次数 // 把 vector 内容经转换函数复制进 set排序 去重 转小写 // transform(words.begin(), words.end(), // insert_iteratorsetstring (wordset, wordset.begin()), ToLower); // 对每个单词统计在 vector 中出现的次数 // wordmap[*si] count(words.begin(), words.end(), *si); // 数组表示法wordmap[key] 返回与键关联的值键无效时为 0常见的STL算法查找算法find、count、count_if、binary_search算法核心功能是否需要排序返回结果复杂度find找“第一个” 等于某值的位置❌ 不需要迭代器指向第一个匹配项找不到返回end()O(n) 线性count数 等于某值的元素个数❌ 不需要整数difference_type匹配的数量O(n) 线性count_if数 满足条件谓词 的元素个数❌ 不需要整数匹配的数量O(n) 线性binary_search判断 某值是否存在只回答有/没有✅ 必须排序booltrue/falseO(log n) 对数

相关新闻

24. 函数符

24. 函数符

函数对象函数对象(函数符 functor)函数对象也叫函数符(functor),是可以以函数方式与 () 结合使用的任意对象。这包括函数名、指向函数的指针,以及重载了 () 运算符的类对象(即定义了 operator()…

2026/8/11 11:13:06 阅读更多 →
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 阅读更多 →

最新新闻

终极指南:如何用PKHeX自动合法性插件高效解决宝可梦数据合规难题

终极指南:如何用PKHeX自动合法性插件高效解决宝可梦数据合规难题

终极指南:如何用PKHeX自动合法性插件高效解决宝可梦数据合规难题 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 宝可梦玩家经常面临数据合规性挑战,PKHeX自动合法性插件&#xf…

2026/8/11 11:54:24 阅读更多 →
基于V8隔离的代理优先浏览器Kitesurf:架构、原理与实战指南

基于V8隔离的代理优先浏览器Kitesurf:架构、原理与实战指南

最近在探索浏览器架构与云原生应用开发时,发现了一个非常有意思的开源项目——Kitesurf。它并非我们日常使用的Chrome或Edge,而是一个运行在V8隔离环境中的“代理优先”浏览器。这个概念听起来有些抽象,但如果你对Cloudflare Workers、无服务…

2026/8/11 11:54:24 阅读更多 →
DRG存档编辑器终极指南:3分钟掌握深岩银河游戏全内容解锁技巧

DRG存档编辑器终极指南:3分钟掌握深岩银河游戏全内容解锁技巧

DRG存档编辑器终极指南:3分钟掌握深岩银河游戏全内容解锁技巧 【免费下载链接】DRG-Save-Editor Rock and stone! 项目地址: https://gitcode.com/gh_mirrors/dr/DRG-Save-Editor 还在为《深岩银河》的资源短缺而烦恼?想要快速体验所有职业和装备…

2026/8/11 11:54:24 阅读更多 →
网盘下载新体验:LinkSwift直链助手让文件传输飞起来

网盘下载新体验:LinkSwift直链助手让文件传输飞起来

网盘下载新体验:LinkSwift直链助手让文件传输飞起来 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…

2026/8/11 11:54:23 阅读更多 →
高校一卡通餐厅系统Python架构设计与高并发优化

高校一卡通餐厅系统Python架构设计与高并发优化

1. 项目概述:高校一卡通餐厅系统的技术选型与价值 高校学生一卡通系统是校园信息化建设的核心基础设施,而餐厅消费模块作为使用频率最高的场景之一,其稳定性与扩展性直接影响数万师生的日常体验。传统基于PHP或Java EE的一卡通系统往往面临架…

2026/8/11 11:54:23 阅读更多 →
网络钓鱼已进化:你的“官方”体验可能全是假的

网络钓鱼已进化:你的“官方”体验可能全是假的

你是否接到过这样的电话?对方能准确报出你的姓名、贷款金额甚至逾期天数,语气严厉地要求你立即还款,并附上一个看似正规的协商还款链接。或者,你在某知名媒体公众号上看到一篇标题为“即将抵达!请市民做好准备&#xf…

2026/8/11 11:53:23 阅读更多 →

日新闻

如何用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 阅读更多 →