C++ 设计模式:迭代器模式(Iterator Pattern)

server/2025/1/7 19:29:58/

链接:C++ 设计模式
链接:C++ 设计模式 - 组合模式
链接:C++ 设计模式 - 职责链模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式使得我们可以遍历不同类型的集合对象,而无需了解其底层实现。

1. 问题分析

在开发中,我们经常需要遍历集合对象(如数组、列表、树等)中的元素。不同集合对象的内部实现可能不同,但我们希望能够以一致的方式遍历它们,而不需要了解其内部结构。

迭代器模式通过提供一个统一的接口来遍历集合对象,使得客户端代码可以一致地访问不同类型的集合对象。迭代器模式将遍历操作封装在迭代器对象中,从而将集合对象的遍历与集合对象的实现分离。

2.实现步骤

  1. 定义迭代器接口(Iterator):声明遍历元素的方法,如next()、hasNext()等。
  2. 实现具体迭代器类(ConcreteIterator):实现迭代器接口,负责遍历集合对象中的元素。
  3. 定义聚合接口(Aggregate):声明创建迭代器的方法。
  4. 实现具体聚合类(ConcreteAggregate):实现聚合接口,创建具体迭代器对象。

3.代码示例

3.1.定义迭代器接口

template <typename T>
class Iterator {public:virtual ~Iterator() {}virtual bool hasNext() = 0;virtual T next() = 0;
};

3.2.实现具体迭代器

template <typename T>
class ConcreteIterator : public Iterator<T> {public:ConcreteIterator(const std::vector<T>& collection) : collection(collection), index(0) {}bool hasNext() override { return index < collection.size(); }T next() override { return collection[index++]; }private:std::vector<T> collection;size_t index;
};

3.3.定义集合接口

template <typename T>
class IterableCollection {public:virtual ~IterableCollection() {}virtual Iterator<T>* createIterator() = 0;
};

3.4.实现具体集合

template <typename T>
class ConcreteCollection : public IterableCollection<T> {public:void addItem(const T& item) { collection.push_back(item); }Iterator<T>* createIterator() override { return new ConcreteIterator<T>(collection); }private:std::vector<T> collection;
};

3.5.客户端代码

int main() {ConcreteCollection<int> collection;collection.addItem(1);collection.addItem(2);collection.addItem(3);Iterator<int>* iterator = collection.createIterator();while (iterator->hasNext()) {std::cout << iterator->next() << " ";}std::cout << std::endl;delete iterator;return 0;
}

4.STL

在现代C++编程中,标准模板库(STL)提供了强大且灵活的迭代器机制,极大地简化了集合对象的遍历操作。因此,STL中的迭代器在很大程度上取代了手动实现的迭代器模式

示例:遍历std::vector

int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用迭代器遍历vectorfor (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用范围for循环遍历vectorfor (int value : vec) {std::cout << value << " ";}std::cout << std::endl;return 0;
}

http://www.ppmy.cn/server/156160.html

相关文章

【LLM】概念解析 - Tensorflow/Transformer/PyTorch

背景 本文将从算法原理、适用范围、强项、知名大模型的应用、python 调用几个方面&#xff0c;对深度学习框架 TensorFlow、PyTorch 和基于深度学习的模型 Transformer 进行比较。主要作用是基础概念扫盲。 一、 算法原理对比 Transformer Transformer 是一种基于深度学习的…

STL常用容器总结

1.Vector容器特性 vector 容器是一个长度动态改变的动态数组&#xff0c;既然也是数组&#xff0c;那么其内存是一段连续的内存&#xff0c;具有数组的随机存取的优点。 / 1.1.vector特性总结: 1.vector 是动态数组&#xff0c;连续内存空间&#xff0c;具有随机存取效率高的…

.NET中的强名称和签名机制

.NET中的强名称&#xff08;Strong Name&#xff09;和签名机制是.NET Framework引入的一种安全性和版本控制机制。以下是关于.NET中强名称和签名机制的详细解释&#xff1a; 强名称 定义&#xff1a; 强名称是由程序集的标识加上公钥和数字签名组成的。程序集的标识包括简单文…

1.LwIP_概述

LwIP是什么&#xff1a; LwIP是轻量级TCP/IP协议栈。 TCP/IP协议栈数据的封装与解封装&#xff1a; 发送端在最上层产生用户数据&#xff0c;之后经过应用层、传输层、网络层&#xff0c;这几层对数据的首部进行添加控制信息&#xff0c;到达数据链路层后&#xff0c;添加首部…

深入探索:将 Elasticsearch 与 Ruby 工具结合使用

深入探索&#xff1a;将 Elasticsearch 与 Ruby 工具结合使用 一、背景介绍 1. Elasticsearch 与 Ruby 的结合背景 在现代软件开发中&#xff0c;Elasticsearch 作为一个基于 Lucene 的搜索引擎&#xff0c;以其分布式、可扩展、实时搜索等特点而广受欢迎。Ruby&#xff0c;…

【XJTUSE算法】考题回忆及复习建议

前言 考完其实记得很多题&#xff0c;但是因为图形学挨得太近没有第一时间整理&#xff0c;现在对着考完记的原题发呆…更新于2025.1.5&#xff0c;你们将就着看吧&#xff0c;只能回忆大概百分之五十了。 祝老师超级超级好&#xff0c;没考代码板子&#xff0c;如果之后的学妹…

8、RAG论文笔记(Retrieval-Augmented Generation检索增强生成)

RAG论文笔记 1、 **研究背景与动机**2、方法概述3、RAG 模型架构3.1总体架构3.2 Generator&#xff08;生成器&#xff09;3.3 检索器&#xff08;Retriever&#xff09;3.4训练&#xff08;Training&#xff09;3.5**解码方法**&#xff08;求近似 &#xff09;3.6微调的参数 …

解决TortoiseGit 在Windows系统中文件不显示状态图标的问题

图标覆盖的数量限制 Windows 资源管理器对图标覆盖数量有限制&#xff0c;通常最多支持 11 个图标覆盖。如果安装了其他应用程序&#xff08;如 Dropbox、OneDrive 等&#xff09;也使用了图标覆盖&#xff0c;TortoiseGit 的图标可能会因为超出限制而不显示。 解决方法&#…