当前位置: 首页 > 网络知识

C++ 设计模式之迭代器模式

时间:2026-01-26 14:20:04

设计模式之迭代器模式


迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。该模式很好理解,C++中的迭代器应该都用过,和那个差不多。其UML图如下:

ConcreteIterator内部有一个聚合对象的引用(指针),而ConcreteAggregate依赖于ConcreteIterator。以前向链表为例,示例代码如下:

1 // IteratorModel.h文件 2 #pragma once 3 #include <iostream> 4 // 单向链表 5 template<typename T> 6 class node 7 10 T data; 11 node * next; 12 }; 13 // 迭代器 14 template<typename T> 15 class IteratorBase 16 ; 23 24 template<typename T> 25 class Iterator; 26 // 单项链表 27 template<typename T> 28 class forwardlist 29 ; 54 // 具体的迭代器 55 template<typename T> 56 class Iterator : public IteratorBase<T> 57 68 T first() 69 72 T next() 73 83 T currentItem() 84 87 bool isDone() 88 93 T operator*() 94 97 }; 98 99 // forwardlist函数实现 100 // 创建迭代器函数 101 template<typename T> 102 Iterator<T> forwardlist<T>::createIterator() 103 106 107 template<typename T> 108 forwardlist<T>::forwardlist() : m_nLength(0u), m_HeadNode(nullptr) 109 112 113 template<typename T> 114 forwardlist<T>::~forwardlist() 115 119 120 template<typename T> 121 node<T> * forwardlist<T>::getNode(unsigned int index) 122 128 unsigned int n = 0; 129 node<T> * pnode = m_HeadNode; 130 while (n++ <= index) 131 134 return pnode; 135 } 136 137 template<typename T> 138 T forwardlist<T>::getElement(unsigned int index) 139 142 143 template<typename T> 144 T forwardlist<T>::getFirst() 145 148 149 template<typename T> 150 T forwardlist<T>::getTail() 151 156 return getElement(m_nLength 1); 157 } 158 159 template<typename T> 160 unsigned int forwardlist<T>::insertElement(unsigned int index, T elem) 161 167 node<T> * pnode = m_HeadNode; 168 unsigned int n = 0u; 169 while (n++ < index)// 定位到index上一个节点 170 173 // 插入节点 174 node<T> *pnodeElem = new node<T>; 175 pnodeElem>data = elem; 176 pnodeElem>next = pnode>next; 177 pnode>next = pnodeElem; 178 // 长度增加 179 m_nLength++; 180 return index; 181 } 182 183 template<typename T> 184 unsigned int forwardlist<T>::insertFirst(T elem) 185 188 189 template<typename T> 190 unsigned int forwardlist<T>::appendElement(T elem) 191 194 195 template<typename T> 196 unsigned int setValue(unsigned int index, T value) 197 203 node<T> * pnode = m_HeadNode; 204 while (n++ <= index)// 定位到index 205 208 pnode>data = value; 209 return index; 210 } 211 212 template<typename T> 213 T forwardlist<T>::deleteElement(unsigned int index) 214 220 unsigned int n = 0u; 221 node<T> * pnode = m_HeadNode; 222 while (n++ < index)// 定位到index上一个节点 223 226 // 删除节点 227 node<T> * pnodeTemp = pnode>next; 228 pnode>next = pnodeTemp>next; 229 T tTemp = pnodeTemp>data; 230 delete pnodeTemp; 231 pnodeTemp = nullptr; 232 // 长度减一 233 m_nLength; 234 return tTemp; 235 } 236 237 template<typename T> 238 void forwardlist<T>::deleteAll() 239 244 m_HeadNode>next = nullptr; 245 } 246 247 template<typename T> 248 unsigned int forwardlist<T>::getLength() 249 252 253 template<typename T> 254 bool forwardlist<T>::empty() 255 258 259 template<typename T> 260 node<T> * forwardlist<T>::getFirstNode() 261

测试代码如下:

1 #include <iostream> 2 #include "IteratorModel.h" 3 4 int main() 5

测试结果如下图:



上一篇:Qt 分层架构的使用和优化
下一篇:C++ 设计模式之组合模式
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素