《设计模式》建议的接口应该要有:
public interface Iterator
{
public Object First();
public Object Next();
public boolean isDone();
public Object CurrentItem();
}
STL的iterator相信大家都很熟悉,这个模式没什么多的说的。STL中分五种迭代器:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器。
这里有说明:http://blog.csdn.net/sim_szm/article/details/8980879
先看测试用例:
#include "Iterator.h"
int main(int argc, char* argv[])
{
MyStack *mystak = new MyStack();
for (int i = 0; i<6;i++){
mystak->push(i);
}
MyStackIterator *myit = new MyStackIterator(mystak);
/**
cout<<(*myit)++<<endl;
myit->Next();
cout<<myit->currData()<<endl;
**/
while (!myit->isEnd()){
cout<<myit->currData()<<endl;
myit->Next();
}
return 0;
}
迭代器模式头文件:自己想了好几种实现,用模板要做的事情似乎太多,并且和《设计模式》上的思想出入较大
(STL是为了避免虚函数带来性能开销,所以用模板实现,以前自己实现了一遍STL,现在有点忘了),还是用继承的方式了。
// Iterator.h: 定义控制台应用程序的入口点。//************************************************************************/
/* @filename Iterator.cpp
@author wallwind
@createtime 2012/10/30 23:58
@function 迭代器模式
@email wochenglin@qq.com
*/
/************************************************************************/
#include <iostream>
using namespace std;
enum{MAXSIZE =100,};
//class Iterator;
class MyStackIterator;
class MyStack
{
public:
MyStack(){
m_top =0;
};
~MyStack(){
};
void push(int x){
if(m_top>MAXSIZE){
return ;
}
m_stack[m_top++] = x;
}
int pop(){
if(m_top<0){
return -1;
}
return m_stack[--m_top];
}
friend class MyStackIterator;
private:
int m_top;
int m_stack[MAXSIZE];
};
class Iterator
{
public:
Iterator(){};
virtual ~Iterator(){};
virtual void Next()=0;
virtual int operator++() = 0;
virtual bool isEnd() = 0;
virtual int currData() = 0;
};
class MyStackIterator : public Iterator
{
public:
MyStackIterator(MyStack* stack)
:m_myStack(stack){
m_index = 0;
}
~MyStackIterator(){
if (m_myStack!=NULL){
delete m_myStack;
}
}
virtual int operator++(){
if (m_index<m_myStack->m_top){
return m_myStack->m_stack[m_index++];
}
return m_myStack->m_stack[m_index];
}
virtual void Next(){
if (m_index<m_myStack->m_top){
m_index++;
}
}
virtual bool isEnd(){
return m_index > m_myStack->m_top;
}
virtual int currData(){
return m_myStack->m_stack[m_index];
}
private:
MyStack * m_myStack;
int m_index;
};