c++ 迭代器模式(iterator)
2024-08-23 01:29:37
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。同时需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪 一项等统一接口。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集 合内部的数据。
代码如下:
#include <iostream>
#include <string>
#include <vector> using namespace std; class Iterator
{
public:
Iterator(){};
virtual ~Iterator(){};
virtual string First() = ;
virtual string Next() = ;
virtual string GetCur() = ;
virtual bool IsEnd() = ;
}; class Aggregate
{
public:
virtual int Count() = ;
virtual void Push(const string& strValue)=;
virtual string Pop(const int nIndex)=;
virtual Iterator* CreateIterator() = ;
}; class ConcreteIterator : public Iterator
{
public:
ConcreteIterator(Aggregate* pAggregate):m_nCurrent(),Iterator()
{
m_Aggregate = pAggregate;
}
string First()
{
return m_Aggregate->Pop();
}
string Next()
{
string strRet;
m_nCurrent++;
if(m_nCurrent < m_Aggregate->Count())
{
strRet = m_Aggregate->Pop(m_nCurrent);
}
return strRet;
}
string GetCur()
{
return m_Aggregate->Pop(m_nCurrent);
}
bool IsEnd()
{
return ((m_nCurrent >= m_Aggregate->Count()) ? true: false);
}
private:
Aggregate* m_Aggregate;
int m_nCurrent;
}; class ConcreteAggregate : public Aggregate
{
public:
ConcreteAggregate():m_pIterator(NULL)
{
m_vecItems.clear();
}
~ConcreteAggregate()
{
if(NULL != m_pIterator)
{
delete m_pIterator;
m_pIterator = NULL;
}
}
Iterator* CreateIterator()
{
if(NULL == m_pIterator)
{
m_pIterator = new ConcreteIterator(this);
}
return m_pIterator;
}
int Count()
{
return m_vecItems.size();
}
void Push(const string& strValue)
{
m_vecItems.push_back(strValue);
}
string Pop(const int nIndex)
{
string strRet;
if(nIndex < Count())
{
strRet = m_vecItems[nIndex];
}
return strRet;
}
private:
vector<string> m_vecItems;
Iterator* m_pIterator; };
main 函数
#include "iterator.h" int main()
{
ConcreteAggregate* pName = NULL;
pName = new ConcreteAggregate();
if(NULL != pName)
{
pName->Push("hello");
pName->Push("word");
pName->Push("cxue");
}
Iterator* iter = NULL;
iter = pName->CreateIterator();
if(NULL != iter)
{
string strItem = iter->First();
while(!iter->IsEnd())
{
cout << iter->GetCur() << " is ok" << endl;
iter->Next();
}
}
system("pause"); return ;
}
最新文章
- Session的属性
- WaterfallTree(瀑布树) 详细技术分析系列
- 自定义Dialog宽度占满屏幕
- Cacheable key collision with DefaultKeyGenerator
- Scala 深入浅出实战经典 第43讲:主要介绍类型变量bound
- VS2013配置Caffe卷积神经网络工具(64位Windows 7)——准备依赖库
- 常见http代码错误原因及处理
- PCA样本数量少于矩阵维数
- Centos7 安装mongodb3.2.9 过程
- JSON和XML:不可同日而语
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
- 将其它图片格式转为.eps格式
- keycode 锁键盘按键(只能输入数字)
- java 测试IP
- Linux Centos 6.5_x86安装Nginx
- C++ Opencv remap()重映射函数详解及使用示例
- EntityFramework(1)基础概念与Database First
- 2)django-请求生命周期
- BZOJ3417[Poi2013]Tales of seafaring——BFS
- Java多线程学习(吐血超详细总结)(转)
热门文章
- MySQL5.6版本性能调优my.cnf详解
- PADS VBA 编写笔记
- windows下使用linux命令搜文件
- Java类型强制转换
- Unit05: JavaScript对象概述 、 常用内置对象一 、 常用内置对象二 、 常用内置对象三
- 瞎记录java (含this 的用法)
- 操作系统-百科:Linux
- line 3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: No such file or directory
- node 中 npm报错 Error: ENOENT, stat &#39;C:\Users\Administrator\AppData\Roaming\npm&#39;
- WARN deprecation:&;L - HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration