cpp: Iterator Pattern

发布时间 2023-05-27 13:15:40作者: ®Geovin Du Dream Park™

 

/*****************************************************************//**
 * \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
请按任意键继续. . .