C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景)

2023-11-05

迭代器模式是一种行为型模式


 

优点:

  • 它支持以不同的方式遍历一个聚合对象,而无需暴露它的内部表示。
  • 迭代器简化了聚合类。
  • 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无需修改原有代码。

缺点:

  • 由于多了一个抽象层,会增加系统的复杂性。
  • 对于简单的遍历(如数组),使用迭代器方式遍历较为繁琐。
  • 总之,迭代器模式在需要对聚合对象进行遍历时非常有用,它可以让用户通过特定的接口访问容器中的数据,而无需了解容器内部实现细节。

满足的设计原理:

  • “单一职责原则”要求一个类应该只有一个引起它变化的原因。在迭代器模式中,遍历操作被分离到了迭代器类中,使得聚合类和迭代器类各自只负责一件事,符合单一职责原则。
  • “迪米特法则”要求一个对象应当对其他对象有尽可能少的了解。在迭代器模式中,客户端只需要知道迭代器的接口,而无需了解聚合对象的内部实现,符合迪米特法则。

常用实例:

迭代器模式常用于遍历各种容器,如链表、数组、树等。例如,在STL(C++标准模板库)中,就广泛使用了迭代器模式。STL中的容器(如vector、list、set等)都提供了迭代器,可以使用迭代器来遍历容器中的元素。
 

类图:

常规代码:

#include "iostream"
#include "string"
#include <vector>

using namespace std;

class Aggregate
{
public:
	virtual ~Aggregate(){};
	virtual class Iterator*CreateIterator()=0;
	
};

class Iterator
{
public:
	virtual ~Iterator(){}
	virtual void First()=0;
	virtual void Next()=0;
	virtual bool IsDone()=0;
	virtual int CurrentItem()=0;
};

class ConcretaAggregate:public Aggregate {

public: 
	ConcretaAggregate(initializer_list<int> values):values_(values){}

	Iterator*CreateIterator();
	
	int Count()const
	{
		return values_.size();
	}

	int Get(int index)const
	{
		return values_[index];
	}


private:
	vector<int> values_;

};




class ConcreteIterator :public Iterator {
public:
	ConcreteIterator(const ConcretaAggregate*aggregate):aggregate_(aggregate),current_(0){}

	void First()
	{
		current_=0;
	}

	void Next()
	{
		++current_;
	}

	bool IsDone()
	{
		return current_>=aggregate_->Count();
	}

	int CurrentItem()
	{
		return aggregate_->Get(current_);
	}


private:
	const ConcretaAggregate*aggregate_;
	int current_;
};



Iterator* ConcretaAggregate::CreateIterator()
{
	return new ConcreteIterator(this);
}


int main() 
{
	ConcretaAggregate aggregate{1,2,3,4,5};
	Iterator*it=aggregate.CreateIterator();
	for (it->First();!it->IsDone();it->Next())
	{
		cout<<it->CurrentItem()<<endl;
	}
	vector<int> nu{1,2,3}; 

	for (vector<int>::iterator it=nu.begin();it!=nu.end();it++)
	{
	}

	return 0;
}

STL  C++ 标准容器类中类代码:

template<typename T>
class AA {
public:
	class iterator {
	public:
		iterator(T* ptr) : _ptr(ptr) {}
		iterator operator++() { ++_ptr; return *this; }
		bool operator!=(const iterator& other) const { return _ptr != other._ptr; }
		T operator*() const { return *_ptr; }
	private:
		T* _ptr;
	};
	AA(T* num, int size) : _num(num), _size(size) {}
	iterator begin() { return iterator(_num); }
	iterator end() { return iterator(_num + _size); }
private:
	T* _num;
	int _size;
};

int main() {
	int num[] = { 1, 2, 3, 4, 5 };
	AA<int> aa(num, sizeof(num) / sizeof(int));
	for (AA<int>::iterator it = aa.begin(); it != aa.end(); ++it) {
		std::cout << *it << std::endl;
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景) 的相关文章

  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 关于SQL注入报错:Illegal mix of collations for operation ‘UNION‘原因剖析与验证

    关于SQL注入报错 Illegal mix of collations for operation UNION 原因剖析与验证 今天练习了一下DVWA的SQL注入模块 使用了union注入时报错如下 Illegal mix of colla
  • 解决“vue-router子路由默认视图不显示”问题

    今天在看Vue学习视频 老师讲解vue router多级路由的使用 在写完视频里的例子后 自己测试发现一个小问题 当时视频里没有提及 我是用name实现的路由之间的切换 其中一个有子路由 发现子路由的默认显示没有了 第一次默认有 第二次点击
  • JVM GC算法 CMS 详解(转)

    前言 CMS 全称Concurrent Low Pause Collector 是jdk1 4后期版本开始引入的新gc算法 在jdk5和jdk6中得到了进一步改进 它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求 能够承受垃圾回
  • Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3 7 0 asyncio模块的实现思路 当前编程语言都开始在语言层面上 开始简化对异步程序的编程过程 其中Python中也开始了在语言层面上对异步编程的简化 特地使用了
  • Redis分布式锁的实现(Jedis和Redisson两个方案)

    应用场景 分布式锁主要用于解决 公司中不同业务系统对同一功能的数据产生脏读或重复插入 比如公司现有三个小组分别开发WAP站 小程序 APP客户端 而这三个系统都存在领红包功能 业务要求每人每日只能领取一个红包 如果有人同时登陆三个系统那么就
  • C语言函数返回值不能直接写数组

    C语言返回值不能直接写数组 ifndef VMATH H define VMATH H ifdef cplusplus extern C endif typedef float Matrix44f 16 Matrix44f translat
  • 分布式事务理论与实践

    一 产生背景 业务服务化拆分 原本一个服务能完成的业务操作现在需要跨多个服务 分库分表 写操作可能跨多个数据库 二 理论基础 2 1 2PC协议 角色说明 事务管理器 负责分布式事务的发起与结束 以及失败重试等 事务发起方 资源管理器 本地
  • pyenv管理python版本

    一 介绍 pyenv 是 Python 版本管理工具 pyenv 可以改变全局的 Python 版本 安装多个版本的 Python 设置目录级别的 Python 版本 还能创建和管理 virtual python environments
  • 编程语言比拼之Java VS C++

    学Java还是C Java和C 都是非常受欢迎的编程语言 各有各的优势和适用场景 以下是对它们的简要比较 性能 C 通常被认为是一种更高效的编程语言 适用于对性能要求较高的应用程序 如游戏开发 嵌入式系统和高频交易等 C 具有更接近底层的控
  • 常用串口调试工具比较

    在PC机上 目前有许多免费的串口调试工具 比较常用的有 1 串口调试助手 V2 2 优点 使用方便 用户群最多 有书介绍及免费源代码 缺点 1 因采用多线程接收技术 接收有时丢数 特别在高波特率或使用USB转串口时丢数较多 2 最大只支持1
  • java数组之二分查找法(折半查找)

    二分法就是用折半的思想 屁话不多说 上源码 public class BinarySearch 二分查找法 折半 折半查找 使用条件 必须是有序数组 需要三个变量 int min 0 int max 数组 length int mid mi
  • 使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析

    使用OpenCV Numpy计算直方图 Matplot绘制直方图及分析 1 效果图 2 原理 3 源码 3 1 直方图3种计算方法和2种绘制方法 3 2 Mask遮罩图像直方图 参考 这篇博客将介绍如何使用Python OpenCV Num
  • AVALON-MM接口

    AVALON接口分为两类 一种是AVALON MM接口 一般称为MM接口 另一种是AVALON ST接口 刚出来的一种新型接口 MM接口 通过地址读写数据 更多的是用在控制上面 ST接口用于点到点的流数据接口 更多的可以用在有高速通过率的模
  • shell文件通配符(9):任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

    文章目录 一 有哪些文件通配符 二 匹配任意 匹配任意一个字符 匹配任意数量的字符串 三 匹配任意指定一个字符 1 匹配任意包含 匹配任意包含 字符范围 2 与 匹配任意不包含 四 注意事项 1 通配符组合 2 不能跨越目录层级进行通配 3
  • 云呐工单管理对售后服务的全流程进行精细化的管理

    伴随着市场环境的改变 服务管理已融入到各个行业并起着愈来愈重要的功用 成为企业提升产品附加值 施行差异化发展战略 继而获取核心竞争力的较佳方式 带来良好的服务管理有利于企业获取报告信息 减低顾客流失率和赢得更多新顾客 能够促进企业利润的稳步
  • html文字浮动效果,css浮动怎么理解?

    浮动的意义 设置了浮动属性的元素会脱离普通标准流的控制 移动到其父元素中指定的位置的过程 将块级元素放在一行 浮动会脱离标准流 不占位置 会影响标准流 浮动只有左右浮动 不会出现上下浮动 浮动的使用 基本语法格式 选择器 float 属性值
  • pycharm注释快捷键(多行注释快捷键,三引号注释快捷键...)

    一 前言 相信学习python的小伙伴们对pycharm这款软件并不陌生 有时候我们需要在pycharm里面进行批量注释 但是直接一个一个输入注释符号太麻烦了 下面教大家用快捷键进行注释 二 教程 1 多行 单行注释 import torc
  • element 表格内显示图片

    element 表格内显示图片 先看下效果图 如下 再看下前端代码
  • 时间序列分析教程(二):移动平均与指数平滑

    之前介绍了时间序列的基本概念和性质 现在就正式介绍一些处理时间序列的模型方法 第一个是移动平均法 移动平均法很简单 就是用最近的数据预测未来短时间内的数据 有简单移动平均法 真的很简单 就是用最近的一组数据 去平均 作为下一时刻的预测 S
  • C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景)

    迭代器模式是一种行为型模式 优点 它支持以不同的方式遍历一个聚合对象 而无需暴露它的内部表示 迭代器简化了聚合类 在迭代器模式中 由于引入了抽象层 增加新的聚合类和迭代器类都很方便 无需修改原有代码 缺点 由于多了一个抽象层 会增加系统的复