首页 > 其他分享 >cpp: Iterator Pattern

cpp: Iterator Pattern

时间:2023-05-27 13:22:32浏览次数:67  
标签:Iterator 迭代 edit Pattern namespace virtual 2023 cpp include

 

/*****************************************************************//**
 * \file   GoldIterator.h
 * \brief  迭代器模式 Iterator Pattern
 * 2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDITERATOR_H 
#define GOLDITERATOR_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>


using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuIteratorPattern
{
	
	/// <summary>
	/// 抽象迭代器类模板
	/// </summary>
	/// <typeparam name="T"></typeparam>
	template <typename T>
	class GoldIterator
	{
	public:
		/// <summary>
		/// 指向容器中第一个元素
		/// </summary>
		virtual void First() = 0;   
		/// <summary>
		/// 指向下一个元素
		/// </summary>
		virtual void Next() = 0;      
		/// <summary>
		/// 是否遍历完
		/// </summary>
		/// <returns></returns>
		virtual bool IsDone() = 0;   
		/// <summary>
		/// 获取当前的元素
		/// </summary>
		/// <returns></returns>
		virtual T& CurrentItem() = 0; 
		/// <summary>
		/// 做父类时析构函数应该为虚函数
		/// </summary>
		virtual ~GoldIterator() {}         



	};

}

#endif


/*****************************************************************//**
 * \file   GoldCotainer.h
 * \brief  迭代器模式 Iterator Pattern
 *  2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDCOTAINER_H 
#define GOLDCOTAINER_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "GoldIterator.h"

using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuIteratorPattern
{


	/// <summary>
	/// 抽象容器类模板
	/// </summary>
	/// <typeparam name="T"></typeparam>
	template <typename T>
	class GoldCotainer
	{

	public:
		/// <summary>
		/// 创建迭代器
		/// </summary>
		/// <returns></returns>
		virtual GoldIterator<T>* CreateIterator() = 0; 
		/// <summary>
		/// 获取当前元素
		/// </summary>
		/// <param name="index"></param>
		/// <returns></returns>
		virtual T& getItem(int index) = 0;  
		/// <summary>
		/// 容器中元素数量
		/// </summary>
		/// <returns></returns>
		virtual int getSize() = 0;  
		/// <summary>
		/// 做父类时析构函数应该为虚函数
		/// </summary>
		virtual ~GoldCotainer() {} 


	};

}

#endif

/*****************************************************************//**
 * \file   GoldVectorIterator.h
 * \brief  迭代器模式 Iterator Pattern
 *  2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDVECTORITERATOR_H 
#define GOLDVECTORITERATOR_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "GoldIterator.h"
#include "GoldCotainer.h"

using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuIteratorPattern
{

	/// <summary>
	/// 具体迭代器类模板
	/// </summary>
	/// <typeparam name="T"></typeparam>
	template <typename T>
	class GoldVectorIterator :public GoldIterator<T>
	{
	public:
		/// <summary>
		/// 
		/// </summary>
		/// <param name="tmpc"></param>
		GoldVectorIterator(GoldCotainer<T>* tmpc) :myVector(tmpc)
		{
			mCurrent = 0;
		}
		/// <summary>
		/// 容器(数组)中的第一个元素下标为0
		/// </summary>
		virtual void First()
		{
			mCurrent = 0; 
		}
		/// <summary>
		/// 下标+1,意味着数组中的下一个元素
		/// </summary>
		virtual void Next()
		{

			mCurrent++; 
		}
		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		virtual bool IsDone()
		{
			if (mCurrent >= myVector->getSize())
			{
				return true;
			}
			return false;
		}
		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		virtual T& CurrentItem()
		{
			return myVector->getItem(mCurrent);
		}
	private:
		/// <summary>
		/// 
		/// </summary>
		GoldCotainer<T>* myVector;
		/// <summary>
		/// 记录数组的当前下标(迭代器在当前容器中的位置)
		/// </summary>
		int mCurrent;  

	};

}

#endif

/*****************************************************************//**
 * \file   GoldVector.h
 * \brief  迭代器模式 Iterator Pattern
 *  2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDVECTOR_H 
#define GOLDVECTOR_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "GoldIterator.h"
#include "GoldCotainer.h"
#include "GoldVectorIterator.h"

using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuIteratorPattern
{


	/// <summary>
	/// 具体容器类模板
	/// </summary>
	template <typename T>
	class GoldVector:public GoldCotainer<T>
	{
	public:
		
		
		GoldVector()
		{
			//将数组中元素进行初始化
			for (int i = 0; i < 10; ++i)
			{
				mElem[i] = i;
			}
		}
		

	
		virtual GoldIterator<T>* CreateIterator()
		{
			//工厂模式,注意实参传递进去的是该容器的指针this
			return new GoldVectorIterator<T>(this); //要考虑在哪里释放的问题
		}

		
	
		virtual T& getItem(int index)
		{
			return mElem[index];
		}
		
		

		/// <summary>
		/// 为简化代码,返回固定数字
		/// </summary>
		virtual int getSize()
		{
			return 10; 
		}
	private:
		/// <summary>
		/// 为了简化代码,将容器实现为固定装入10个元素的数组
		/// </summary>
		T mElem[10];


	};

}

#endif

/*****************************************************************//**
 * \file   GeovinDu.h
 * \brief  迭代器模式 Iterator Pattern
 *  2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GEOVINDU_H 
#define GEOVINDU_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "GoldIterator.h"
#include "GoldCotainer.h"
#include "GoldVectorIterator.h"
#include "GoldVector.h"

using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuIteratorPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GeovinDu
	{

	private:

	public:

		/// <summary>
		/// 迭代器模式示例
		/// </summary>
		void displaySimple();


	};

}

#endif


/*****************************************************************//**
 * \file   GeovinDu.cpp
 * \brief  迭代器模式 Iterator Pattern
 *  2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#include "GeovinDu.h"
using namespace std;



/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuIteratorPattern
{

	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displaySimple()
	{
		    /**/
			std::vector<int> msgVector;
			msgVector.push_back(1); //末尾插入1,vector中内容:1
			msgVector.push_back(2); //开头插入2,vector中内容:1,2
			msgVector.push_back(3); //末尾插入3,vector中内容:1,2,3
			for (std::vector<int>::iterator pos = msgVector.begin(); pos != msgVector.end(); ++pos)
			{
				cout << *pos << endl;
			}
			cout << "-------------------" << endl;
			std::list<int>  msgList;
			msgList.push_back(1); //末尾插入1,list中内容:1
			msgList.push_front(2);//开头插入2,list中内容:2,1
			msgList.push_back(3); //末尾插入3,list中内容:2,1,3
			for (std::list<int>::iterator pos = msgList.begin(); pos != msgList.end(); ++pos)
			{
				cout << *pos << endl;
			}
			cout << "-------------------" << endl;

			/**/
			DuIteratorPattern::GoldCotainer<int>* dupcontainer = new DuIteratorPattern::GoldVector<int>();
			DuIteratorPattern::GoldIterator<int>* duiter = dupcontainer->CreateIterator();
			//遍历容器中的元素
			for (duiter->First(); !duiter->IsDone(); duiter->Next()) //多态机制的遍历,效率上不好,尽量考虑栈机制
			{
				cout <<"迭代器:"<< duiter->CurrentItem() << endl;
			}

			cout << "-------------------" << endl;
	
	

			DuIteratorPattern::GoldCotainer<int>* pcontainer = new DuIteratorPattern::GoldVector<int>();
			DuIteratorPattern::GoldVectorIterator<int> iter(pcontainer);
			//遍历容器中的元素	
			for (iter.First(); !iter.IsDone(); iter.Next())//非多态机制,可以明显改善程序性能
			{
				cout <<"迭代器:"<< iter.CurrentItem() << endl;
			}


			//释放资源
			delete duiter;
			delete dupcontainer;



			//释放资源
			delete pcontainer;


	}


}

  

调用:

/*****************************************************************//**
 * \file   ConsoleDuIteratorPattern.cpp
 * \brief  迭代器模式 Iterator Pattern
 *  2023年5月22日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
// ConsoleDuIteratorPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 2023年5月12日 涂聚文 Geovin Du Visual Studio 2022 edit.
#define _UNICODE


#include <iostream>
#include <vector>
#include <list>

#include "GeovinDu.h"
#ifdef _DEBUG   //只在Debug(调试)模式下
#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符
#define new DEBUG_NEW
#endif
#endif
using namespace std;
using namespace DuIteratorPattern;


int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口

    std::cout << "Hello World!涂聚文 Geovin Du\n";
    GeovinDu geovin;
    geovin.displaySimple();

    system("pause");
    return 0;

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define UNICODE

  

输出:

Hello World!涂聚文 Geovin Du
1
2
3
-------------------
2
1
3
-------------------
迭代器:0
迭代器:1
迭代器:2
迭代器:3
迭代器:4
迭代器:5
迭代器:6
迭代器:7
迭代器:8
迭代器:9
-------------------
迭代器:0
迭代器:1
迭代器:2
迭代器:3
迭代器:4
迭代器:5
迭代器:6
迭代器:7
迭代器:8
迭代器:9
请按任意键继续. . .

 

 

 

 

标签:Iterator,迭代,edit,Pattern,namespace,virtual,2023,cpp,include
From: https://www.cnblogs.com/geovindu/p/17436613.html

相关文章

  • Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】
     〇、简介1、什么是简单工厂模式?一句话解释:  客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。简单工厂模式(SimpleFactoryPattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需......
  • 《设计模式之禅》Multition_Pattern--多例模式
    多例模式嘿,咱们书接上回。单例模式就是每次只能有一个实例,那么多例模式就是可以有多个实例对象。那在中国历史上有没有这种事情发生过呢,嘿,你别说,还真有,就出现在明朝,那三国期间的算不算,不算,各自称帝,各有各的地盘,国号不同。大家还记得那首诗《石灰吟》吗?作者是谁?于谦,他是被谁杀死的?明......
  • CPPCheck 安装使用
    直接通过命令行安装:sudoapt-getinstallcppcheck通过下载源码包安装,比如2.10版本:1.登录http://cppcheck.net/下载2.10版本soucecode并解压2.cdcppcheck-2.10&&mkdirbuild&&cdbuild3.cmake..可能报错:NOCMAKE_CXX_COMPILERcouldbefoundSo......
  • 《设计模式之禅》Singleton_Pattern--单例模式
    单例模式这个模式是很有意思,确实很有意思的,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝(就是那个天子)中国的历史上很少出现两个皇帝并存的......
  • 【CPP0049】以Point类及平面基类Plane类为基础设计圆类Circle并实现相关文件操作
    基于Point类及平面基类Plane类,设计圆类Circle,并为Point类和Circle重载实现<<和>>运算符,main(void)函数实现Point对象和Circle对象的文件读写操作。@Point类结构说明: Point类的数据成员包括:①私有数据成员:X坐标x(double型),Y坐标y(double型)。Point类成员函数包括:①有参构造......
  • 报错:TypeError: Found non-callable @@iterator
    代码://自动导入插件constautpImport=require('unplugin-auto-import/webpack')(...autoImportConfig)报错 TypeError:Foundnon-callable@@iterator原因:使用...扩展符的时候该对象是不可迭代对象。这里  autoImportConfig是一个对象,该函数参数需要传入......
  • 享元模式(Flyweight Pattern)
    享元模式(FlyweightPattern)一、定义享元模式(FlyweightPattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。运用共享技术有效地支持大量细粒度的对象。二、优缺点优点:大......
  • pta_【CPP0038】单向链表模板类
    #include<iostream>usingnamespacestd;template<typenameT>classNode{public:Node(Tdata):data(data),next(nullptr){cout<<"NodeConstructorrun"<<endl;}Node(constNode<T>&other)......
  • 外观模式(Facade Pattern)
    外观模式(FacadePattern)一、定义 外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对......
  • 策略模式(Strategy Pattern)
    一、模式动机策略模式(StrategyPattern)用于算法的自由切换和扩展,是一种使用较为广泛的行为型模式。策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便地更换算法或者增加新的算法。它将每一个算法封装在一个称为具体策略的类中,......