迭代器模式(C++)

news2024/11/26 12:44:45

定义

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

应用场景

  • 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。
  • 使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。

结构

在这里插入图片描述

代码示例

//Iterator.h
/****************************************************/
#ifndef ITERATOR_H
#define ITERATOR_H
#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;
 
};


#endif
//test.cpp
/****************************************************/
#include "Iterator.h"
 
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;
}

运行结果
在这里插入图片描述

要点总结

  • 迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。
  • 迭代多态:为遍历不同的集合结构提供一个统一的接口, 从而支持同样的算法在不同的集合结构.上进行操作。
  • 迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

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

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

相关文章

kafka:java client使用总结塈seek() VS commitSync()的区别(三)

最近一段日子接触了kafka这个消息系统&#xff0c;主要为了我的开源中间件项目simplemq增加kafka支持&#xff08;基于kafka-client【java】&#xff09;&#xff0c;如今总算完成&#xff0c;本文是对这个过程中对kafka消息系统的使用总结 线程安全 关于线程安全&#xff0c…

04-2_Qt 5.9 C++开发指南_SpinBox使用

文章目录 1. SpinBox简介2. SpinBox使用2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. SpinBox简介 QSpinBox 用于整数的显示和输入&#xff0c;一般显示十进制数&#xff0c;也可以显示二进制、十六进制的数&#xff0c;而且可以在显示框中增加前缀或后缀。 QDoubleSpinBox…

无人车沿着指定线路自动驾驶与远程控制的实践应用

有了前面颜色识别跟踪的基础之后&#xff0c;我们就可以设定颜色路径&#xff0c;让无人车沿着指定线路做自动驾驶了&#xff0c;视频&#xff1a;PID控制无人车自动驾驶 有了前几章的知识铺垫&#xff0c;就比较简单了&#xff0c;也是属于颜色识别的一种应用&#xff0c;主要…

Vue + Cesium快速搭建,全流程(最新总结)

方式一&#xff1a;直接引入&#xff08;最简单&#xff09; 1.安装Cesium&#xff08;Vue搭建可以看我上一期的文章&#xff09; npm i cesium -save2.将node_modules\cesium\Build\Cesium文件夹拷贝到项目的public文件中 3.在public\index.html引入Cesium <!DOCTYPE h…

1466. 重新规划路线

题目描述&#xff1a; 主要思路&#xff1a; 将所有有向边抽象为无向边&#xff0c;将原有的方向权重置为1&#xff0c;其余置为0。 从0开始遍历所有城市&#xff0c;ans权重和。 class Solution { public:vector<vector<int>> a,w;int ans0;bool book[500010];v…

Node.js |(一)Node.js简介及计算机基础 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;关于Node.js&#x1f407;为什么要学Node.js&#x1f407;Node.js是什么&#x1f407;Node.js的作用&#x1f407;Node.js下载安装&#x1f407;命令行工具&#x1…

【Linux】多路转接 -- poll函数

文章目录 1. poll函数原型2. poll服务器3. poll的优点和确定 1. poll函数原型 poll函数和与我上一篇文章介绍的select函数一样&#xff0c;都是系统提供的多路转接接口&#xff0c;允许进程或线程在同一时间监听多个文件描述符。 本篇文章的一部分内容与上一篇介绍select函数…

Report Sharp-Shooter Lite Edition Crack

Report Sharp-Shooter Lite Edition Crack 报告Sharp Shooter™ 是为.NET Framework设计的&#xff0c;使用C#编写&#xff0c;并且只包含100%的托管代码。Report Sharp Shooter能够从多个数据源生成任何复杂的报告&#xff0c;并将生成的报告导出为大多数格式&#xff0c;包括…

UNIX 入门

与 UNIX 建立连接启动会话登录命令提示符修改口令退出系统 简单的 UNIX 命令命令格式ls 命令who 命令虚拟终端 tty伪终端 ptywho am i 命令 cal 命令help 命令man 命令 shell 概述shell 命令更换 shell临时更改 shell永久更改 shell 登录过程 与 UNIX 建立连接 启动会话 要启…

Java Set集合:HashSet和TreeSet类

Set 集合类似于一个罐子&#xff0c;程序可以依次把多个对象“丢进”Set 集合&#xff0c;而 Set 集合通常不能记住元素的添加顺序。也就是说 Set 集合中的对象不按特定的方式排序&#xff0c;只是简单地把对象加入集合。Set 集合中不能包含重复的对象&#xff0c;并且最多只允…

【无标题】发大水

发大声道TOC 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语…

K8s集群安全机制

1.访问K8s集群的时候&#xff0c;需要经过三个步骤完成具体操作 &#xff08;1&#xff09;认证&#xff08;2&#xff09;鉴权&#xff08;授权&#xff09;&#xff08;3&#xff09;准入控制 进行访问的时候&#xff0c;过程中都要经过apiserver&#xff0c;apiserver做统…

Qt小项目贪吃蛇实线,主要掌握定时器、信号与槽、按键事件、绘制事件、坐标运算、随机数生成等

Qt小项目贪吃蛇实线&#xff0c;主要掌握定时器、信号与槽、按键事件、绘制事件、坐标运算、随机数生成等 Qt 贪吃蛇演示QWidget 绘制界面项目源文件 注释清晰widget.hwidget.cpp 拓展QTimerQKeyEventQRectFQPointFQPainterQIcon Qt 贪吃蛇演示 QWidget 绘制界面 项目源文件 注…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建 bbcbbc

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务…

Unity Sort Group(排序组)

** Unity 中的Sort Group组组件允许让Sprite Renderer(精灵渲染器)重新决定渲染顺序. ** 作为组件存在 组件内容&#xff1a; Unity 使用Sort Group 组件的Sort layer 和Order in layer的值来确定排序组在渲染队列内相对与场景内其他排序组和游戏对象的优先级。 属性功能So…

解密时尚RFID服装电商仓储系统

大家好&#xff0c;今天我们要聊一个时尚圈的新宠——RFID服装电商仓储系统&#xff01;是不是听起来就很高端大气上档次&#xff1f;别急&#xff0c;我会来给你扒一扒这个神秘的系统。 首先&#xff0c;咱们得搞清楚什么是RFID。别想太复杂&#xff0c;RFID就是一种让衣服变得…

大数据课程H2——TELECOM的电信流量项目实现

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解TELECOM项目的数据收集&#xff1b; ⚪ 了解TELECOM项目的数据清洗&#xff1b; ⚪ 了解TELECOM项目的数据导出&#xff1b; ⚪ 了解TELECOM项目的数据可视化&…

抖音小店规则解读:开设个人店铺,合规经营

抖音小店是抖音平台上的一项功能&#xff0c;允许用户在抖音上开设个人店铺&#xff0c;进行商品销售。下面不若与众将介绍关于抖音小店的一些规则&#xff1a; 1. 店铺资质要求&#xff1a;开设抖音小店需要满足一定的资质要求&#xff0c;包括拥有有效身份证件、年满18周岁、…

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容&#xff0c;信息以逗号分隔生成的&#xff0c;现需求要根据此字段数据在其它表查询相关的内容展现出来&#xff0c;第一想法是切割数据&#xff0c;以逗号作为切割符&#xff0c;以下为总结的实现方法&#xff0c;以供大家参…

设计中存在的误区

1、子组件&#xff0c;如果想要出现宽度和高度&#xff0c;要在子组件中的最大的盒子定义宽度和高度&#xff0c;才能出现 1.1 你在common.js定义是不管用的&#xff0c;要在自己的盒子中定义长度和高度