cpp: Iterator Pattern
C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、范型形式(generic)、元编程形式(metaprogramming)的语言。
/*****************************************************************//**
* \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 请按任意键继续. . .


哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)