Iterator Patterns: 迭代器的封装一定离不开容器,但是自己写容器不仅仅给STL的容器套个壳,就需要用到双重指针来存储源数据

Intent

Provide a way to access the elements of an aggregate object sequentially without
exposing its underlying representation.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// refactoringtopattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <exception>

#define DEFAULT_LIST_CAPACITY 1024

template<class Item>
class Iterator {
public:
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() const = 0;
    virtual Item CurrentItem() const = 0;
protected:
    Iterator() {
        std::cout << __FUNCTION__ << std::endl;
    }
};

template<class Item>
class IteratorPtr {
public:
    IteratorPtr(Iterator<Item>* i) :i_(i) {}
    ~IteratorPtr() {
        delete i_;
    }
    Iterator<Item>* operator->() {
        return i_;
    }
    Iterator<Item>& operator*() {
        return *i_;
    }
private:
    // multiple deletions of i_
    IteratorPtr(const IteratorPtr&) {}
    IteratorPtr& operator=(const IteratorPtr& a) {
        return (*this);
    }

private:
    Iterator<Item>* i_;
};

// 抽象接口
template<class Item>
class AbstractList {
public:
    AbstractList() {}
    virtual Iterator<Item>* CreateIterator() const = 0;
};

template<typename Item>
class ListIterator;

// 实现接口
template<class Item>
class List : public AbstractList<Item>{
public:
    List(long size = DEFAULT_LIST_CAPACITY) {
        Item** new_item = new Item * [size];
        for (int i = 0; i < size; i++)
        {
            new_item[i] = new Item();
        }
        item_ = new_item;
        item_count_ = size;
    }
    long Count() const {
        return item_count_;
    }
    Item& Get(long index) const {
		return  *(*(item_ + index));
    }
    virtual Iterator<Item>* CreateIterator() const {
        return new ListIterator<Item>(this);
    }
private:
    Item** item_;
    long item_count_;
};

class IteratorOutOfBounds : public std::exception {
public:
    const char* what() const throw() {
        return "son of bitch!";
    }
};

template<class Item>
class ListIterator : public Iterator<Item> {
public:
    ListIterator(const List<Item>* aList) :Iterator<Item>(),list_(aList), current_(static_cast<long>(0)) {
    }
    virtual void First() {
        current_ = 0;
    }
    virtual void Next() {
        current_++;
    }
    virtual bool IsDone() const {
        return current_ >= list_->Count();
    }
    virtual Item CurrentItem() const {
        // c++ primer : exception
        if (IsDone()) {
            throw IteratorOutOfBounds();
        }
        return list_->Get(current_);
    }
private:
    const List<Item>* list_;
    long current_;
};


template<class Item>
class ListTraverser {
public:
	ListTraverser(List<Item>* aList) :iterator_(aList) {}
	bool Traverse() {
		bool result = false;
		for (iterator_.First(); !iterator_.IsDone(); iterator_.Next()) {
			result = ProcessItem(iterator_.CurrentItem());
			if (result == false)
				break;
		}
		return result;
	}
protected:
    virtual bool ProcessItem(const Item&) = 0;
private:
    ListIterator<Item> iterator_;
};

class Employee {
public:
    Employee() {}
    ~Employee() {}
    void Print() {
        std::cout << __FUNCTION__ << std::endl;
    }
};

class PrintNEmployees : public ListTraverser<Employee*> {
public:
	PrintNEmployees(List<Employee*>* aList, int n) :
		ListTraverser<Employee*>(aList),
		total_(n), count_(0) {}
protected:
	bool ProcessItem(Employee* const& e) {
		count_++;
		e->Print();
		return count_ < total_;
	}
private:
	int total_;
	int count_;
};


template<class Item>
class FilteringListTraverser {
public:
    FilteringListTraverser(List<Item>* aList) :iterator_(aList){}
	bool Traverse() {
		bool result = false;

		for (iterator_.First(); !iterator_.IsDone(); iterator_.Next()) {
			if (TestItem(iterator_.CurrentItem()))
			{
				result = ProcessItem(iterator_.CurrentItem());
				if (result == false)
					break;
			}
		}
		return result;
	}
protected:
	virtual bool ProcessItem(const Item&) = 0;
	virtual bool TestItem(const Item&) = 0;
private:
	ListIterator<Item> iterator_;
};


void PrintEmployees(Iterator<Employee*>& i) {
    for (i.First(); !i.IsDone(); i.Next()) {
        i.CurrentItem()->Print();
    }
}

int main()
{
    {
        AbstractList<Employee*>* employees = new List<Employee*>(9);
        IteratorPtr<Employee*> iterator(employees->CreateIterator());
        PrintEmployees(*iterator);
    }

    {
        List<Employee*>* employees = new List<Employee*>(10);
        PrintNEmployees pa(employees, 10);
        pa.Traverse();
    }

	{ // prints the first 10 employees
        List<Employee*>* employees = new List<Employee*>(5);
		ListIterator<Employee*> i(employees);
		int count = 0;
		for (i.First(); !i.IsDone(); i.Next()) {
			count++;
			i.CurrentItem()->Print();
			if (count >= 3)
				break;
		}
	}


}


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine&#xff1a;使用仿射变换矩阵对图像进行变换&#xff0c;可以实现平移、缩放和旋转等操作。cv2.warpPerspective&#xff1a;使用透视变换矩阵对图像进行透视变换&#xff0c;可以实现镜头校正、图像纠偏等…

三十分钟学会Linux的基本操作

GNU/Linux GNU项目是由Richard Stallman发起的自由软件运动&#xff0c;旨在创建一个完全自由的操作系统。虽然GNU项目已经开发了大量的系统组件和工具&#xff0c;但它一直缺少一个完整的操作系统内核。在这时Linus Torvalds开发了Linux内核&#xff0c;并将其发布为自由软件…

浅谈建筑能耗智能监测平台发展现状及未来趋势

安科瑞 华楠 摘要&#xff1a;文章以每年发布的上海市国家机关办公建筑和大型公共建筑能耗监测及分析报告变化为切入点&#xff0c;分析了历年能耗分析报告的内容和功能变化&#xff1b;介绍了上海市国家机关办公建筑和大型公共建筑能耗监测平台发展和应用历程&#xff1b;揭示…

Socket通信之网络协议基本原理

一台机器将自己想要表达的内容&#xff0c;按照某种约定好的格式发送出去&#xff0c;当另外一台机器收到这些信息后&#xff0c;也能够按照约定好的格式解析出来&#xff0c;从而准确、可靠地获得发送方想要表达的内容。这种约定好的格式就是网络协议&#xff08;Networking P…

验证码 | 可视化一键管控各场景下的风险数据

目录 查看今日验证数据 查看未来趋势数据 验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身…

代码随想录刷题】Day15 二叉树02------延伸题目练习

文章目录 1.【100】相同的树1.1 题目描述1.2 java代码实现 2.【572】另一棵树的子树2.1 题目描述2.2 java代码实现 【100】相同的树 【572】另一棵树的子树 1.【100】相同的树 1.1 题目描述 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。…

在 VSCode 中使用 GDB 进行 C/C++ 程序调试(图文版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

浅谈能源智能管理系统在大学高校中的应用

安科瑞 华楠 摘要&#xff1a;结合深圳南方科技大学能效系统工程设计实例&#xff0c;针对校园中电耗、热量消耗、冷量消耗及水资源消耗数据的采集、传输、分析管理系统&#xff0c;分析了系统中的水、电、气在高校中的能耗分布&#xff0c;并阐述了节能应用方案&#xff0c;可…

AWS Step Function 异步动态调用 Lambda 后汇集结果

分布式计算有这么一个需求&#xff0c;主进程准备好输入数据&#xff0c;然后根据输入中某个 Items 动态调用若干计算进程&#xff0c;待到所有计算完成后再汇集结果。这一需求移植到 AWS 上就像是下面这样子 但在一个 Lambda 中同步调用其他 Lambda 时就有个费时费钱的问题&am…

Linux中的MFS分布式文件系统

目录 一、MFS分布式文件系统 1、MooseFS简介 2、Moose File System的体系结构 &#xff08;1&#xff09;MooseFS Master &#xff08;2&#xff09;MooseFS Chunk Server &#xff08;3&#xff09;MooseFS Metalogger &#xff08;4&#xff09;MooseFS Client &…

程序的执行原理(下)

文章目录 系统的硬件组成总线I/0设备主存处理器程序计数器&#xff08;PC&#xff09;加载:存储:操作:跳转: 运行 hello 程序读入寄存器&#xff0c;再把它存放到内存从磁盘加载程序到主存处理器执行程序并显示 参考 系统的硬件组成 总线 贯穿整个系统的是一组电子管道&#…

人工标签不准确的一种解决方案:PCA降维可视化筛选正样本

背景 在实际的业务场景里&#xff0c;用会话文本构建模型&#xff08;机器学习/深度学习&#xff09;来做意图分类之类的任务时&#xff0c;经常会出现人工打标不够准确的问题&#xff0c;标签都不准确的话模型当然无法学习到有效信息了。这个问题真的非常头疼…除了与业务沟通…

工业风格大屏:让数据更生动,直观更简单

硬工业风格可视化大屏是一种以工业为主题的大屏展示方式&#xff0c;具有极强的视觉冲击力和直观性。它将大屏展示和硬件设计融为一体&#xff0c;将数据以可视化的方式呈现出来&#xff0c;帮助用户更好地理解数据背后的含义和价值。 硬工业风格可视化大屏如&#xff1a; 硬工…

《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar

tabBar是用QT插件实现的一个dll&#xff0c;对于插件的使用可以参考文章&#xff1a; 《QT从基础到进阶三十三》QT插件开发QtPlugin 源码放在文章末尾 该功能类似侧边工具栏&#xff0c;可以在该标签栏上添加自己开发的界面&#xff0c;实现代码如下&#xff1a; 1、所有功能…

modbus协议及modbus TCP协议

一、Modbus协议 1.起源 Modbus由Modicon公司于1979年开发&#xff0c;是一种工业现场总线协议标准。 Modbus通信协议具有多个变种&#xff0c;其中有支持串口&#xff0c;以太网多个版本&#xff0c;其中最著名的是Modbus RTU&#xff08;通信效率最高&#xff0c;基于串口&am…

【鸿蒙生态千帆起】HarmonyOS 系统级地图与位置服务,赋能广大开发者

在"与 HarmonyOS 同行&#xff0c;开放生态&#xff0c;共赢未来"为主题的 HUAWEI Developer Day&#xff08;简称 HDD&#xff09;沙龙中&#xff0c;Petal Maps 为开发者们带来了在 HarmonyOS 下地图领域的最新技术探索与实践成果。 得益于 HarmonyOS 一次开发多端…

[点云分割] 欧式距离分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <chrono>#include <pcl/ModelCoefficients.h> // 模型系数的定义 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/sample_c…

探讨大型公共建筑能耗监测与信息管理系统研究及应用

安科瑞 华楠 摘要&#xff1a;文章通过阐述大型公共建筑能耗现状&#xff0c;突出大型公共建筑实施节能监管的必要性&#xff0c;并在系统总结运用技术手段实施建筑能耗监测的基础上&#xff0c;介绍了江苏省建筑能耗监测系统研究过程中的技术创新和应用情况。 关键词&#x…

新手做抖店,这6点建议一定要收好,能让你不亏钱!

我是电商珠珠 我呢&#xff0c;目前身居郑州。 电商这个行业也做了5年多了&#xff0c;抖店从20年开始做&#xff0c;到现在也已经快3年了。 其实&#xff0c;我做抖店期间呢&#xff0c;踩过很多坑&#xff0c;所以今天就把我所踩过的坑&#xff0c;给做抖店的新手总结了6点…

opencv-图像对比度增强

对比度增强&#xff0c;即将图片的灰度范围拉宽&#xff0c;如图片灰度分布范围在[50,150]之间&#xff0c;将其范围拉升到[0,256]之间。这里介绍下 线性变换&#xff0c;直方图正规化&#xff0c;伽马变换&#xff0c;全局直方图均衡化&#xff0c;限制对比度自适应直方图均衡…