《设计模式》建议的接口应该要有:
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;
};