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

news2024/11/24 3:28:33

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、迭代器模式是什么?

       迭代器模式是一种行为型的软件设计模式,提供一种方法能顺序访问聚合对象中的各个元素,而又不暴露其内部。

       我们使用的聚合对象各种各样,比如vector、list、tree、map等等,既然是聚合,那就有访问其个体的需要。而遍历访问这个行为可能有深度优先、广度优先、顺序遍历、逆序遍历等等,迭代器的意义就是将这个行为抽离封装起来,这样客户端只需要调用合适的迭代器,来进行对应的遍历,而不用自己去实现这一行为。

       迭代器模式的优点:

  1. 符合单一职责原则。将遍历行为抽离成单独的类。
  2. 符合开闭原则。添加新集合或者新迭代器,不改变原有代码。
  3. 便于扩展多种遍历行为。
  4. 访问数据又不暴露内部。

      迭代器模式的缺点:

  1. 若对聚合对象只需要进行简单的遍历行为,那使用迭代器模式有些大材小用。
  2. 系统复杂性提高,类数量较多。

二、迭代器模式

2.1 结构图

       客户端即Main主函数,容器创建迭代器进行遍历。

2.2 代码示例

       场景描述:设计一个简单容器存放数据,并用迭代器顺序遍历。

//Iterator.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>

using namespace std;

// 定义迭代器接口
class Iterator 
{
public:
	// 下一个
	virtual int next() = 0;

	// 是否有下一个
	virtual bool hasNext() = 0;

};

// 定义具体迭代器
class ConcreteIterator : public Iterator 
{
public:
	// 构造函数
	ConcreteIterator(std::vector<int> data) : m_data(data), index(0) {}

	// 下一个
	virtual int next() {
		return m_data[index++];
	}

	// 是否有下一个
	virtual bool hasNext() {
		return index < m_data.size();
	}

private:
	std::vector<int> m_data;
	int index;

};

// 定义容器接口
class Container 
{
public:
	virtual Iterator* create_iterator() = 0;
};

// 定义具体容器
class ConcreteContainer : public Container 
{
public:
	// 构造函数
	ConcreteContainer(std::vector<int> data) : m_data(data) {}

	// 创建迭代器
	virtual Iterator* create_iterator() {
		return new ConcreteIterator(m_data);
	}

private:
	std::vector<int> m_data;

};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Iterator.h"

using namespace std;

int main() 
{
	// 创建容器和迭代器
	std::vector<int> data = { 1, 2, 3, 4, 5 };
	Container* container = new ConcreteContainer(data);
	Iterator* iterator = container->create_iterator();

	// 迭代器输出
	while (iterator->hasNext()) {
		std::cout << iterator->next() << " ";
	}
	
	// 清除
	delete iterator;
	delete container;
	iterator = nullptr;
	container = nullptr;
	return 0;
}

       程序结果如下。

       迭代器应该算是大家熟知的内容了,在使用STL容器时,经常会用到各种迭代器。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对迭代器模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解迭代器模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

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

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

相关文章

如何做好缓存设计?

大家好&#xff0c;我是易安&#xff01;今天我们来谈一谈缓存应该如何设计。 什么是缓存 缓存是一种临时储存数据的方式。当用户查询数据时&#xff0c;系统会首先在缓存中查找&#xff0c;如果数据已经存在于缓存中&#xff0c;则直接使用&#xff0c;否则系统会到数据的原始…

研报精选230410

目录 【行业230410西南证券】医药行业2023年4月投资月报&#xff1a;看好创新药和中药行情【行业230410国信证券】汽车行业4月投资策略&#xff1a;3月新能源乘用车批发销量预计同比增长32%&#xff0c;持续关注板块年报季报行情【行业230410西南证券】医药行业周报&#xff1a…

【集成架构】探索3种顶级「集成框架」Apache、Spring和Mule

正确的集成框架是绑定应用程序架构构建块的粘合剂。应用程序组件必须不断交换关键数据&#xff0c;以方便用户操作、服务扩展、威胁监视、后端操作、事件触发等。如果没有可靠的集成过程&#xff0c;应用程序和服务故障将淹没软件环境。正确的集成框架是绑定应用程序架构构建块…

【JAVA】#详细介绍!!! synchronized 加锁 详解(1)!

本文分以下几点来介绍synchronized&#xff08;根据JDK1.8&#xff09; 1. 介绍synchronized 2. synchronized 为什么能保证线程安全 3. synchronized 的 用法 4. synchronized 的锁特性 目录 1. 介绍synchronized 2. synchronized的用法 2.1 synchronized修饰指定代码块 2…

如何定位Spark数据倾斜问题,解决方案

文章目录前言一、数据倾斜和数据过量二、 数据倾斜的表现三、定位数据倾斜问题定位思路&#xff1a;查看任务-》查看Stage-》查看代码四、7种典型的数据倾斜场景解决方案一&#xff1a;聚合元数据解决方案二&#xff1a;过滤导致倾斜的key解决方案三&#xff1a;提高shuffle操作…

谁才是天下第一关?

什么是关&#xff0c;中华大地有多少关&#xff1f; 关是往来必由之要处。“山川扼要&#xff0c;是设关津。表封藏&#xff0c;以达道路&#xff0c;天险既呈&#xff0c;人力并济”。 关可分为&#xff1a; 关防&#xff0c;驻兵防守的要塞&#xff1b;关津&#xff0c;水陆…

python笔记:qgrid

在Jupyter Notebook中像在Excel一样操作pandas的DataFrames&#xff0c;如sort/filter&#xff0c;并轻松把操作后的数据用于后续分析。 0 安装 pip install qgrid jupyter nbextension enable --py --sys-prefix qgrid 1 基本使用方法 1.1 数据 import numpy as np import…

Carla 保姆级安装教程

一&#xff1a;电脑配置 carla支持windows,Linux系统构建&#xff0c;官方对于安装电脑的最低配置要求是拥有6G显存的GPU&#xff0c;推荐8G显存的GPU&#xff0c;至少需要20G的存储空间&#xff0c;所有对电脑的配置要求是不小的挑战。 我所使用电脑的硬件配置&#xff1a;3…

3.7 曲率

学习目标&#xff1a; 如果我要学习高等数学中的曲率&#xff0c;我会遵循以下步骤&#xff1a; 1.熟悉相关的数学概念&#xff1a;在学习曲率之前&#xff0c;我们需要了解曲线、切线和曲率半径等相关的数学概念。因此&#xff0c;我会复习这些概念&#xff0c;以便更好地理…

网卡别名的设置

文章目录1. 网卡别名是什么2. 工作原理3. 设置3.1 临时添加&#xff0c;重启失效3.1.1 使用ipconfig命令来设置网卡别名3.1.2 使用ip addr命令来设置网卡别名3.2 永久性添加3.3 查看参考1. 网卡别名是什么 IP别名就是一张物理网卡上配置多个IP&#xff0c;实现类似子接口之类的…

制作PassMarkMemTest86启动U盘

制作PassMarkMemTest86启动U盘1. 概述2.制作 PassMarkMemTest86 启动U盘结束语1. 概述 PassMarkMenTest86 是一款免费、开源且强大的内存检测工具&#xff0c;能测试电脑内存的稳定性、存储大小和隐性问题&#xff0c;它还拥有 13 种不同的 RAM 测试算法&#xff0c;在主菜单中…

洛丽运动会 NFT 作品集第一弹

欢迎来到 2036 年洛丽运动会&#xff0c;这是一个以史前世界为背景的体育小游戏体验。为了庆祝这场伟大比赛的开始&#xff0c;结合了史前和运动配件的 NFT 系列将于北 The Sandbox 市场平台发布。 运动和格斗设备将提高你在运动会上的技能&#xff1b;而史前配件将使你与体育场…

Linux高并发服务器(webserver)

一.有限状态机 它的转移函数表示系统从一个状态转移到另一个状态的条件 二.EPOLL 在内核中创建一个数据&#xff0c;这个数据有两个比较重要的数据&#xff0c;一个是需要检测的文件描述符的信息&#xff08;红黑树&#xff09;&#xff0c;一个双向链表&#xff0c;存放检测到…

Java类加载机制介绍

类加载机制的简单介绍 类加载机制是指将.class字节码文件读入到内存中。在运行时数据区中的方法区保留类的数据结构&#xff0c;在堆中创建一个与之对应的Class对象。 类的生命周期主要经历7个阶段&#xff1a;加载、验证、准备、解析、初始化、使用、卸载 其中从加载到初始化…

如何通俗易懂的解释无线通信中的那些专业术语!

这是一篇来自网络的非常经典的一篇老文&#xff0c;原作者不详&#xff0c;但非常值得一读&#xff01; 香农定理 类比&#xff1a;城市道路上的汽车的车速和什么有关系&#xff1f;和道路的宽度有关系&#xff0c;和自己车的动力有关系&#xff0c;也其他干扰因素有关系&…

Unity接SDK - 极光推送

2021.09.09记录&#xff0c;2023发布&#xff0c;如有不对&#xff0c;还请包含。发晚了 如果想看Android原生接入JPush - SDK&#xff0c;移步Android原生集成JPush SDK_jpush android sdk v4.7.2 极光推送 - 接入 版本&#xff1a; Unity 2020.3.10f1 JPush - Unity 3…

linux系统安全及应用

目录一、账号安全控制1.1基本安全措施1.1.1系统账号的清理1.1.1.1将非登录用户的Shell设为/sbin/nologin1.1.1.2锁定长期不使用的账号1.1.1.3删除无用账号1.1.1.4锁定账号文件passwd、shadow1.1.2密码安全控制1.1.2.1设置密码有效期1.1.2.2要求用户下次登录时修改密码1.1.3命令…

服务端开发之Java秋招面试11

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧&#xff01; 目录 1.MySQL的多版本并发控制具体实现过程&#xff1f;…

目标检测YOLO系列-YOLOVX运行步骤(推理、训练全过程)

下载项目&#xff1a;点击下载 进入项目根目录&#xff08;通过cd命令&#xff09; apex的安装与下载 下载apex git clone https://github.com/NVIDIA/apex进入apex目录 cd apex执行安装命令 python setup.py install首先安装相关的类库&#xff1a; pip install -i https://p…

深入学习MongoDB---1---入门篇+基础重点篇

MongoDB入门 MongDB作为NoSQL数据库之一&#xff0c;主要关注&#xff1a;灵活性、扩展性、高可用灵活性&#xff1a;NoSQL的特点就是反范式理论&#xff0c;为数据的水平扩展和字段的组织提供了巨大的便利高可用&#xff1a;天生就伴随副本集&#xff08;从节点&#xff09;的…