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