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

embedded/2025/1/8 17:02:13/

链接: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/embedded/151780.html

相关文章

Verilog语法之文件读写

摘要&#xff1a;本文主要介绍了Verilog语法中关于文件操作的内容&#xff0c;在仿真中我们可以利用文件来存储测试数据或者将测试结果写入相应的文件中&#xff0c;下面介绍了如何操作文件以及给出了相应的例子。 1.文件打开$fopen 系统任务$fopen用于打开指定文件名的文件&a…

风控算法开发过程中常用评估指标

最近整理了一下风控算法开发过程中常用的模型层面指标。模型指标的选择和评估不仅直接关系到算法性能&#xff0c;还影响到模型在实际业务场景中的适配性和稳定性。因此&#xff0c;这里主要聚焦于模型层面的评估指标&#xff0c;如 KS、Lift、PSI 和 KL 散度&#xff0c;以及它…

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。动图演示&#xff1a; 在微服务系统…

使用 `llama_index` 构建智能问答系统:多种文档切片方法的评估

使用 llama_index 构建智能问答系统&#xff1a;多种文档切片方法的评估 代码优化与解析1. **代码结构优化**2. **日志管理**3. **环境变量管理**4. **模型初始化**5. **提示模板更新**6. **问答函数优化**7. **索引构建与查询引擎**8. **节点解析器测试** 总结 在现代自然语言…

EPS32基础篇开发

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 开发 EPS32基础篇 前言一、GPIO输入输出GPIO可设置一下4种状态代码示例&#xff1a;检测按键&#xff0c;按下时&#xff1a;LED亮&#xff0c;松开时&#xff0c;LED灭 二、…

面试场景题系列:设计搜索自动补全系统

当我们在谷歌上搜索或者在亚马逊上购物时,只要在搜索框中打字,网页上就会展示一个或者更多的与搜索词匹配的结果。这个功能叫作自动补全(Autocomplete)、提前输入(Typeahead)、边输边搜(Search-as-you-type)或者增量搜索(Incremental Search)。图-1展示了一个谷歌搜索的示例,…

元宇宙金融新纪元:CZ协议全球启航

2025年&#xff0c;金融领域即将迎来一场具有划时代意义的重大变革——CZ协议&#xff0c;这个被全球金融科技爱好者翘首以盼的项目&#xff0c;将正式启动&#xff0c;为全球用户带来前所未有的机遇与体验&#xff0c;引领我们进入一个全新的数字金融时代&#xff0c;你准备好…

新模型设计:Attention-ResNet for CIFAR-10 分类

新模型设计:Attention-ResNet for CIFAR-10 分类 目录 新模型设计:Attention-ResNet for CIFAR-10 分类引言1. Attention-ResNet 简介2. Attention-ResNet 的数学原理2.1 残差连接2.2 通道注意力机制2.3 损失函数3. Attention-ResNet 网络结构4. 环境准备与数据集介绍4.1 环境…