迭代器模式(Iterator)

news2025/1/21 9:34:17

参考:

迭代器设计模式 (refactoringguru.cn)

[design-patterns-cpp/Iterator.cpp at master · JakubVojvoda/design-patterns-cpp · GitHub

文章目录

    • 一、什么是迭代器模式?
    • 二、实现
    • 三、优缺点
      • 优点
      • 缺点

一、什么是迭代器模式?

提供一种方法,顺序访问一个聚合对象中(集合)的各个元素,而又不暴露该对象的内部表示。

在这里插入图片描述

二、实现

在这里插入图片描述

迭代器(Iterator)模式包含以下主要角色:

1、抽象聚合类(Aggregate)角色:也有人把它叫集合。抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口,声明一个createIterator方法用于创建一个迭代器对象。
2、具体聚合类(Concrete Aggregate)角色:具体聚合类实现了创建相应迭代器的接口,实现了在聚合类中声明的createIterator方法,该方法返回一个与该具体聚合对应的具体迭代器ConcreteIterator实例。
3、抽象迭代器(Iterator)角色:抽象迭代器定义了访问和遍历元素的接口,一般声明如下方法:用于获取第一个元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的currentItem(),在其子类中将实现这些方法。
4、具体迭代器(Concrete Iterator)角色:具体迭代器实现了抽象迭代器接口,完成对聚合对象的遍历,同时在对聚合进行遍历时跟踪其当前对象。

/*
 * C++ Design Patterns: Iterator
 * Author: Jakub Vojvoda [github.com/JakubVojvoda]
 * 2016
 *
 * Source code is licensed under MIT License
 * (for more details see LICENSE)
 *
 */

#include <iostream>
#include <stdexcept>
#include <vector>

class Iterator;
class ConcreteAggregate;

/*
 * Aggregate
 * defines an interface for aggregates and it decouples your
 * client from the implementation of your collection of objects
 */
class Aggregate
{
public:
  virtual ~Aggregate() {}
  
  virtual Iterator *createIterator() = 0;
  // ...
};

/*
 * Concrete Aggregate
 * has a collection of objects and implements the method
 * that returns an Iterator for its collection
 *
 */
class ConcreteAggregate : public Aggregate
{
public:
  ConcreteAggregate( const unsigned int size )
  {
    list = new int[size]();
    count = size;
  }
  
  ~ConcreteAggregate()
  {
    delete[] list;
  }
  
  Iterator *createIterator();
  
  unsigned int size() const
  {
    return count;
  }
  
  int at( unsigned int index )
  {
    return list[ index ];
  }
  // ...

private:
  int *list;
  unsigned int count;
  // ...
};

/*
 * Iterator
 * provides the interface that all iterators must implement and
 * a set of methods for traversing over elements
 */
class Iterator
{
public:
  virtual ~Iterator() { /* ... */ }
  
  virtual void first() = 0;
  virtual void next() = 0;
  virtual bool isDone() const = 0;
  virtual int currentItem() const = 0;
  // ...
};

/*
 * Concrete Iterator
 * implements the interface and is responsible for managing
 * the current position of the iterator
 */
class ConcreteIterator : public Iterator
{
public:
  ConcreteIterator( ConcreteAggregate *l ) :
    list( l ), index( 0 ) {}
  
  ~ConcreteIterator() {}
  
  void first()
  {
    index = 0;
  }
  
  void next()
  {
    index++;
  }
  
  bool isDone() const
  {
    return ( index >= list->size() );
  }
  
  int currentItem() const
  {
    if ( isDone() )
    {
      return -1;
    }
    return list->at(index);
  }
  // ...

private:
  ConcreteAggregate *list;
  unsigned int index;
  // ...
};

Iterator *ConcreteAggregate::createIterator()
{
  return new ConcreteIterator( this );
}


int main()
{
  unsigned int size = 5;
  ConcreteAggregate list = ConcreteAggregate( size );
  
  Iterator *it = list.createIterator();
  for ( ; !it->isDone(); it->next())
  {
    std::cout << "Item value: " << it->currentItem() << std::endl;
  }
  
  delete it;
  return 0;
}

Note

以上使用运行时多态实现的迭代器,以C++中已经用模板替换。当遍历次数较多时,由于访问虚函数表次数过多会导致性能下降,而编译时多态正好弥补了这一问题。

三、优缺点

优点

  • 使用该模式可以减少程序中重复的遍历代码。
  • 如果你希望代码能够遍历不同的甚至是无法预知的数据结构,可以使用迭代器模式。

缺点

  • 对于某些特殊集合, 使用迭代器可能比直接遍历的效率低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QFont-使用外部字体文件的问题

我们程序里面定义了某个结构体(这里简单描述为AStruct)&#xff0c;AStruct包含了一个QFont 类型的成员变量&#xff1a; struct AStruct {QFont ft; }; 在具体业务上&#xff0c;AStruct中的QFont会被传递给QPainter去绘制文本。 保存工程/加载工程时时&#xff0…

用Python写个爬虫,赚了!

前言 编程语言排行榜(Tiobe)发布了11月新榜&#xff0c;Python仍领先Java和C&#xff0c;在全球众多的老牌编程语言中&#xff0c;以其他对手无法企及的极高份额稳居榜单第一位。 榜单数据是客观真实的&#xff0c;当下Python的使用者越来越多&#xff0c;已经远超使用其他十…

【Linux初阶】认识冯诺依曼结构

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;计算机的冯诺依曼组成结构、冯诺依曼结构的数据交换特性&#xff0c;以宏观视角理解冯诺依曼下的网络数据传输…

Spring Cloud Alibaba 容器化部署最佳实践 | 本地部署版本详解

环境声明 在运行本地示例之前&#xff0c;需要保证本机具备以下的基础环境&#xff0c;如果您的本地没有当前的环境&#xff0c;下面会一步步进行搭建&#xff0c;演示搭建过程。 Nacos 服务端Seata 服务端RocketMQ 服务端MySQL 服务端 可在国内https://gitee.com/mirrors/S…

低代码在离散制造业的实践

大家上午好&#xff0c;非常感谢明道云给我这个机会&#xff0c;来展示一下这个上海电气在明道云上面的应用。我的题目是《低代码在离散制造业的实践》。 引入明道云的背景 首先介绍一下我们电气数字科技有限公司。它是在2018年的时候&#xff0c;上海电气集团内部成立的数科…

捷码全新快速表单功能解读

在最近的更新中&#xff0c;捷码迎来了比较多的功能上新&#xff0c;其中最受大家关注的是全新的表单功能。无论是从功能丰富度还是操作便利性上都做了大量设计。本文将从重点功能设置操作流程上进行演示说明。 表单控件和关联 ——1对1、1对n、n对n 支持多场景 首先是表单控…

航空货运数据挖掘那些事|航班换季

目录前言航班换季航班换季对航空货运业务有哪些影响参考文献前言 就在上个月月底&#xff0c;即2022年10月29日到2022年10月30日&#xff0c;中国民航完成了2022年的夏秋季航季到2022/23年冬春航季切换工作&#xff0c;俗称航班换季&#xff0c;那么何为航班换季呢&#xff0c…

流媒体传输 - RTMP 协议

RTMP 是 Real Time Messaging Protocol&#xff08;实时消息传输协议&#xff09;的首字母缩写。它是由 Adobe 公司提出的一种应用层的协议&#xff0c;用来解决多媒体数据传输流的多路复用&#xff08;Multiplexing&#xff09;和分包&#xff08;packetizing&#xff09;的问…

氨基苯酚/多巴胺仿生修饰碳纳米管/α-氧化铝/ CNTs-Ag纳米复合材料

小编下面和大家来看间氨基苯酚/多巴胺仿生修饰碳纳米管/α-氧化铝/ CNTs-Ag纳米复合材料的制备&#xff01; 多巴胺仿生修饰材料的研究&#xff1a; 通过表面聚多巴胺层与银离子的螯合作用,通过表面聚多巴胺与银离子的螯合作用,利用葡萄糖作还原剂,在聚多巴胺修饰的聚酯纤维表…

HarmonyOS应用API手势方法-PanGesture

描述&#xff1a;用于触发拖动手势事件&#xff0c;滑动的最小距离为5vp时拖动手势识别成功。 Api&#xff1a;从API Version 7开始支持 接口&#xff1a; PanGesture(value?: { fingers?: number; direction?: PanDirection; distance?: number } | PanGestureOptions)…

IT6225/IT6225B Type-C转HDMI 4K60设计方案

ITE&#xff08;新联阳&#xff09;的IT6225/IT6225B&#xff0c;是一款Type-C转HDMI 460K的视频转换芯片 通过USB Type-C连接器将DP RX视频信号转换为HDMI/DVI TX视频信号。DP信号转接只用2lane&#xff0c;另外2lane可以输出USB 3.0/3.1信号&#xff0c;同时兼容PD 3.0&…

Zabbix自动监控windows端口(主动监控方式)

第一部分&#xff1a;服务器上的操作&#xff08;脚本&配置&#xff09; 创建脚本文件 在客户端新建discovertcpport.bat文件&#xff0c;放在C:\Program Files\Zabbix Agent目录中&#xff0c;内容如下&#xff1a; echo off echo { echo "data":[ f…

[附源码]计算机毕业设计springboot创意摄影交流平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

python面向对象进阶-继承、多态

继承 python面向对象的继承指的是多个类之间的所属关系&#xff0c;及子类默认继承父类的所有属性和方法#父类A class A(object):def __init__(self):self.num 1#定义成员函数&#xff1a;方法def info_print(self):print(self.num)#子类&#xff0c;继承父类 class B(A):pass…

PaddlePaddle自然语言处理总结

11月28日 week14 周一 910节 物联201 2008070101 本文总结&#xff1a; 1.介绍词向量引入对自然语言处理有着至关重要的作用&#xff1b; 2.介绍了word2vec算法&#xff1b; 3.介绍CBOW算法的实现&#xff1b; 4.介绍Skip-Gram算法的实现。 基本流程&#xff1a; 1.数据预处理&…

​企业该如何做好源代码防泄密工作

​企业该如何做好源代码防泄密工作 随着企业信息化发展的日益增长&#xff0c;软件行业厂商之间的竞争也愈加白热化&#xff0c;加上国内对知识产权的不够重视、山寨模仿产品的横行。保护源代码、保证企业的核心竞争力&#xff0c;成为众多软件研发企业的第一要务。那么企业应…

智能制造云办公 v3.8.10 发布,团队管理更新

智能制造云办公系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模块、…

FusionCompute五个网络平面

文章目录前言一、五个网络平面二、管理网络平面三、存储网络平面四、业务网络平面五、VIMS心跳网络平面前言 FusionCompute 五个网络平面&#xff0c;最少6网口&#xff08;6电或4电2光&#xff09;&#xff0c;最佳8块网卡&#xff08;8个电口或6电口2光口&#xff09; 一套存…

【Mybatis编程:根据id查询相册数据详情】

目录 1.书写SQL语句 2. 在AlbumMapper.java中添加抽象方法 3. 在AlbumMapper.xml中配置SQL语句 4. 在AlbumMapperTests.java中编写并执行测试 1.书写SQL语句 需要执行的SQL语句大致是&#xff1a; SELECT id, name, description, sort FROM pms_album WHERE id? 由于不需要…

Maven下载及环境搭建

目录 一、maven简介 二、maven的下载 1、找到maven官网 2、点击下载 &#xff0c;下载后解压到此电脑 三、配置环境环境变量 1、找到mybatis解压到的目录 2、打开电脑&#xff0c;找到高级系统设置&#xff0c;点击环境变量 3、点击新建&#xff0c;命名为MAVEN_HOME&…