/*****************************************************************//** * \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