news 2026/4/23 12:35:47

设计模式[16]——迭代器模式(Iterator)一分钟彻底说透

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式[16]——迭代器模式(Iterator)一分钟彻底说透

设计模式[16]——迭代器模式(Iterator)一分钟彻底说透(C++版·软件领域真实例子)

一句话定义

提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示,让遍历和容器完全解耦。

最狠的比喻(软件人专属)

STL容器遍历:

vector<int>vec={1,2,3,4};for(autoit=vec.begin();it!=vec.end();++it){cout<<*it;}// 或者 C++11: for (auto& x : vec)

客户端完全不知道vector内部是连续数组,还是list是链表,还是set是红黑树——迭代器隐藏了一切细节!

为什么需要它?(坏味道瞬间爆炸)

不用迭代器,你会这样写:

// 对vectorfor(size_t i=0;i<vec.size();++i)cout<<vec[i];// 对listfor(autonode=list.head;node;node=node->next)cout<<node->data;// 对自定义容器?客户端每次换容器都得重写遍历代码,寄!
和之前模式彻底分清(10秒表)
项目命令(Command)解释器(Interpreter)迭代器(Iterator)
核心意图操作封装成对象解释语法树统一遍历不同容器
关键操作execute()/undo()interpret()递归++it / *it / it != end()
关注点行为封装语法执行访问顺序,不暴露内部结构
典型场景撤销重做规则引擎/表达式STL容器、树遍历、数据库游标
口号“命令即对象”“语法树里走一遭”“换容器不换遍历代码”
真实软件例子:统一遍历不同容器(自定义+STL)
#include<iostream>#include<vector>#include<list>#include<memory>usingnamespacestd;// 1. 迭代器接口(C++标准风格)template<typenameT>classIterator{public:virtual~Iterator()=default;virtualboolhasNext()const=0;virtualTnext()=0;};// 2. 具体容器:动态数组template<typenameT>classVectorContainer{vector<T>data;public:voidadd(constT&item){data.push_back(item);}classVecIterator:publicIterator<T>{typenamevector<T>::iterator it,end;// 注意C++11+可以用autopublic:VecIterator(typenamevector<T>::iterator begin,typenamevector<T>::iterator e):it(begin),end(e){}boolhasNext()constoverride{returnit!=end;}Tnext()override{return*it++;}};unique_ptr<Iterator<T>>createIterator(){returnmake_unique<VecIterator>(data.begin(),data.end());}};// 3. 具体容器:链表template<typenameT>classListContainer{list<T>data;public:voidadd(constT&item){data.push_back(item);}classListIterator:publicIterator<T>{typenamelist<T>::iterator it,end;public:ListIterator(typenamelist<T>::iterator begin,typenamelist<T>::iterator e):it(begin),end(e){}boolhasNext()constoverride{returnit!=end;}Tnext()override{return*it++;}};unique_ptr<Iterator<T>>createIterator(){returnmake_unique<ListIterator>(data.begin(),data.end());}};
客户端:统一遍历代码,换容器无感
intmain(){VectorContainer<string>vecCont;vecCont.add("Alice");vecCont.add("Bob");vecCont.add("Charlie");ListContainer<string>listCont;listCont.add("Dave");listCont.add("Eve");listCont.add("Frank");// 统一遍历函数(客户端代码完全相同!)autoprintAll=[](auto&container){autoiter=container.createIterator();while(iter->hasNext()){cout<<iter->next()<<" ";}cout<<endl;};cout<<"遍历Vector容器: ";printAll(vecCont);// Alice Bob Charliecout<<"遍历List容器: ";printAll(listCont);// Dave Eve Frank// 明天换set、map、自定义树?客户端一行代码不动!}

输出:

遍历Vector容器: Alice Bob Charlie 遍历List容器: Dave Eve Frank
C++ 真实项目里无处不在
  • STL全家桶:vector::iterator、list::iterator、map::iterator、set::iterator
  • 范围for循环:本质就是begin()/end()迭代器
  • 数据库游标:ResultSet的next()遍历行
  • 树/图遍历:前序/中序/后序迭代器(非递归版)
  • Boost.Iterator:各种高级迭代器适配器
现代C++更爽写法(C++20)
for(constauto&item:container){...}// 自动调用begin/end// 自定义容器只需重载begin()和end()即可支持范围for!
终极口诀(STL使用者专属)

“容器千千万,遍历只一行;
迭代器统一,内部随便藏!”

刻在DNA里的一句话

当你有“多种不同结构的容器”,却希望客户端用完全统一的代码遍历时,
立刻上迭代器模式——提供begin/hasNext/next,换底层实现客户端无感!

现在,迭代器模式(STL的灵魂)彻底说透了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 2:25:17

蓝易云 - 详解canal同步MySQL增量数据到ES

下面内容直奔主题、强调可落地性&#xff0c;从原理 → 架构 → 实操 → 风险控制完整拆解 Canal 同步 MySQL 增量数据到 Elasticsearch 的真实生产实现方式&#xff0c;适合直接用于搜索、日志、数据分析、业务检索等场景。一、为什么要用 Canal 做 MySQL → ES 增量同步&…

作者头像 李华
网站建设 2026/4/23 11:13:18

低配置环境运行:CRNN CPU优化技术详解

低配置环境运行&#xff1a;CRNN CPU优化技术详解 &#x1f4d6; 技术背景与挑战 在边缘计算、嵌入式设备和低成本部署场景中&#xff0c;OCR&#xff08;光学字符识别&#xff09; 的需求日益增长。然而&#xff0c;大多数高性能OCR模型依赖GPU进行推理&#xff0c;难以在无显…

作者头像 李华
网站建设 2026/3/31 7:41:06

LangChain+语音合成?教你用开源镜像扩展AI Agent能力

LangChain语音合成&#xff1f;教你用开源镜像扩展AI Agent能力 &#x1f399;️ Sambert-HifiGan 中文多情感语音合成服务 (WebUI API) 项目背景与技术价值 在构建下一代 AI Agent 的过程中&#xff0c;多模态交互能力正成为关键竞争力。传统的文本对话已无法满足用户对自然、…

作者头像 李华
网站建设 2026/4/16 15:19:45

Llama Factory竞技场:不同模型架构的微调效果大比拼

Llama Factory竞技场&#xff1a;不同模型架构的微调效果大比拼 为什么需要模型微调评测环境 在AI技术选型过程中&#xff0c;团队经常需要评估不同开源模型在特定任务上的表现。传统方式需要手动搭建测试环境、安装依赖、配置数据集&#xff0c;整个过程耗时耗力。Llama Facto…

作者头像 李华
网站建设 2026/4/11 20:03:28

对比传统方法:AI解决远程连接问题快3倍的秘密

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个效率对比演示程序&#xff0c;包含两个模式&#xff1a;1. 传统手动排查流程&#xff08;模拟用户逐步检查网络/RDP服务/凭证&#xff09;&#xff1b;2. AI自动诊断模式。…

作者头像 李华
网站建设 2026/4/6 8:46:04

Sambert-Hifigan源码解析:声学模型与声码器协同工作机制

Sambert-Hifigan源码解析&#xff1a;声学模型与声码器协同工作机制 &#x1f4cc; 引言&#xff1a;中文多情感语音合成的技术演进 随着智能语音助手、虚拟主播、有声读物等应用的普及&#xff0c;高质量、富有表现力的中文多情感语音合成&#xff08;Text-to-Speech, TTS&…

作者头像 李华