《設計模式》建議的接口應該要有:
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;
};