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/10/13 8:41:29 阅读更多 →
Vue4.0:开发进度、核心升级与未来特性全景解析

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

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

2026/10/13 8:41:43 阅读更多 →
23.泛型编程下

23.泛型编程下

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

2026/10/8 1:03:23 阅读更多 →

最新新闻

LiteLLM模型网关实践:统一多模型接入与成本管控

LiteLLM模型网关实践:统一多模型接入与成本管控

最近大半年,我一直在琢磨怎么把团队里五花八门的模型调用方式收敛到一个统一的入口。同事有的用某平台的原生 SDK,有的直接封装 HTTP 请求,有的又绕了一层别的工具,光是“换个模型就改一套代码”这事,就已经耗费了大量…

2026/10/13 8:43:01 阅读更多 →
agent-skills:智能体技能治理的注册、路由与观测实战

agent-skills:智能体技能治理的注册、路由与观测实战

大概三个月前,我所在的某项目组正被一堆混乱的智能体技能调用逼得发疯。也正是那次经历,让我决定动手做一套名为 agent-skills 的技能治理系统。当时项目的现状是:一部分工具逻辑硬编码在对话流程里,一部分挂在外部的消息总线上&a…

2026/10/13 8:43:01 阅读更多 →
opencode进阶实战:工具调用、服务面与MCP集成指南

opencode进阶实战:工具调用、服务面与MCP集成指南

1. 工具、服务面、外壳与实战集成:opencode 的进阶打开方式如果上一篇文章是在讲 opencode 的“发动机”——核心模型调度与上下文工程——那么这篇就是聊“方向盘、仪表盘和车厢布局”:怎么把工具(Tools)、服务面(Ser…

2026/10/13 8:43:01 阅读更多 →
AI 编程助手遇 403:故障定位与降级自救指南

AI 编程助手遇 403:故障定位与降级自救指南

最近不少用 AI 编程助手的同学应该都慌了一下:早上还跑得好好的 Cursor,突然开始刷屏报 403,再看一眼,连着 Claude 那几条接口全挂,项目写到一半直接卡死。这种时候最磨人的还不是报错本身,而是你根本分不清…

2026/10/13 8:43:01 阅读更多 →
数据库期末复习指南:ER图转关系模式、SQL查询与范式分解全攻略

数据库期末复习指南:ER图转关系模式、SQL查询与范式分解全攻略

简介:这是一份面向华南师范大学及其他高校学生的《数据库》期末复习知识点汇总PDF,适合考前系统梳理数据库核心概念与关系运算。内容涵盖数据库三级模式与两级映像、数据独立性、数据库系统组成,以及DDL/DML/DCL语言的功能界定;在…

2026/10/13 8:43:01 阅读更多 →
花店管理系统数据库课程设计:从需求分析到SQL实现全流程解析

花店管理系统数据库课程设计:从需求分析到SQL实现全流程解析

简介:数据库课程设计(花店管理系统)是一份完整的数据库课程设计报告,面向计算机相关专业学生,适用于数据库原理与实践类课程的结业设计参考。报告以花店管理系统为案例,详细展示系统规划、用户需求分析、功能结构设计、数据库概念…

2026/10/13 8:41:59 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →