当前位置: 首页 > article >正文

C++二十三种设计模式之迭代器模式

C++二十三种设计模式之迭代器模式

  • 一、组成
  • 二、特点
  • 三、目的
  • 四、缺点
  • 五、示例代码

一、组成

抽象聚合类:存储集合元素,声明管理集合元素接口。
具体聚合类:实现管理集合元素接口。
抽象迭代器类:声明访问和遍历聚合类元素的接口。
具体迭代器类:实现访问和遍历聚合类元素的接口。

二、特点

1、有两种定义模板的方式,template和template。建议使用template,与类定义区分明显。
2、具体聚合类使用抽象聚合类的智能指针成员变量时,需要通过this指针来调用,否则可能会出现找不到该变量的编译报错。

三、目的

不暴露集合底层实现细节的情况下访问和遍历集合中所有元素。

四、缺点

1、性能消耗问题,使用迭代器需要额外的间接层来访问元素,比直接访问元素慢。
2、类膨胀,为了支持多种遍历方式,需要定义多种具体迭代器类。

五、示例代码

#include<iostream>
#include <vector>
#include <list>
#include <string>
#include <mutex>
#include <map>
#include<stack>

using namespace std;

template<typename T>
class Node;//节点类

template<typename T>
class AbstractLinkedList;//抽象聚合类

template<typename T>
class LinkedList;//具体聚合类

template<typename T>
class AbstractIterator;//抽象迭代器类

template<typename T>
class Iterator;//具体迭代器类

template<typename T>
class Node {
public:
	Node(T data) : m_data(data), next(nullptr) {}
	~Node() {
		cout << "~Node" << endl;
	}
	T m_data;
	shared_ptr<Node<T>> next;
};

template<typename T>
class AbstractIterator {
protected:
	AbstractIterator() {}
	virtual void Next() = 0;
	virtual bool hasNext() const = 0;
public:
	shared_ptr<Node<T>> m_current;
};

template<typename T>
class Iterator :public AbstractIterator<T> {//具体迭代器类
public:
	Iterator() {}
	Iterator(shared_ptr<Node<T>> cur) {
		this->m_current = cur;
	}
	void Next() {
		this->m_current = (this->m_current)->next;
	};
	bool hasNext() const {
		return ((this->m_current) != nullptr);
	};
};

template<typename T>
class AbstractLinkedList {
protected:
	virtual Iterator<T> Begin() = 0;
	virtual void append(T value) = 0;
	shared_ptr<Node<T>> m_head;
};

template<typename T>
class LinkedList :public AbstractLinkedList<T> {
public:
	Iterator<T> Begin() {
		return Iterator<T>(this->m_head);
	}

	void append(T value) {
		auto newNode = make_shared<Node<T>>(value);
		if (!this->m_head) {
			this->m_head = newNode;
		}
		else {
			auto cur = this->m_head;
			while (cur->next) {
				cur = cur->next;
			}
			cur->next = newNode;
		}
	}
};

int main() {
	unique_ptr<LinkedList<int>> linkedList = make_unique<LinkedList<int>>();
	linkedList->append(1);
	linkedList->append(2);
	linkedList->append(3);
	for (Iterator<int> iter = linkedList->Begin(); iter.hasNext(); iter.Next()) {
		cout << "value:" << iter.m_current->m_data << endl;
	}
}

http://www.kler.cn/a/472896.html

相关文章:

  • 【vue3封装element-plus的反馈组件el-drawer、el-dialog】
  • maven的简单介绍
  • vue2日历组件
  • 计算机网络基础——网络协议
  • 深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02
  • Mesa llvmpipe和softpipe对比
  • Python爬虫基础——XPath表达式
  • ffmpeg之h264格式转yuv
  • WEBRTC前端播放 播放器组件封装
  • 【Linux】深入理解文件系统(超详细)
  • 自动化执行 SQL 脚本解决方案
  • 十六、Vue 组件
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(26):数字签名
  • 【数据结构-堆】【二分】力扣3296. 移山所需的最少秒数
  • 牛客网刷题 ——C语言初阶(5操作符)——BC90 矩阵计算
  • 解决word桌面图标空白
  • UTTracker背景矫正模块详解:解决无人机追踪中的摄像头运动问题
  • Ruby语言的正则表达式
  • WebSocket 设计思路
  • 怎样用云手机进行海外社媒矩阵引流?
  • 【Linux】lnav - 适用于Linux和Unix的出色终端日志文件查看器
  • windows从0开始配置llamafactory微调chatglm3-6b
  • 使用vue-pdf预览pdf和解决pdf电子签章显示问题
  • 【中标喜讯分享】泰迪智能科技实力中标长春医学高等专科学校健康大数据管理与服务专业实训软件采购项目
  • 计算机网络——期末复习(7)期末试卷样例3
  • CSS语言的软件工程