首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >cpp: Iterator Pattern

cpp: Iterator Pattern

作者头像
geovindu
发布2026-06-19 09:50:18
发布2026-06-19 09:50:18
1040
举报
代码语言:javascript
复制
/*****************************************************************//**
 * \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;
 
 
    }
 
 
}

调用:

代码语言:javascript
复制
/*****************************************************************//**
 * \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

输出:

代码语言:javascript
复制
/*****************************************************************//**
 * \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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档