迭代器【设计模式】

知识点

迭代器(iterator)、游标(cursor)

知识内容

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

示例

这是第一次用模板实现,mark一下。

const出现后,所有出现的变量都需要加const

#include<iostream>
#include<vector>

using namespace std;

template<typename T>
class Iterator
{
  public:
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() = 0;
    virtual T CurrentItem() const = 0;
};

template<typename T>
class Aggregate
{
  public:
    virtual Iterator<T>* CreateIterator() const = 0;
        virtual long Count() const = 0;
    virtual T Get(long index) const = 0;
};

template<typename T>
class ConcreteAggregate: public Aggregate<T>
{
  private:
        vector<T> data;
  public:
    ConcreteAggregate(vector<T> myData):data(myData) {}
    virtual Iterator<T>* CreateIterator() const;
    virtual long Count() const
        {
                return data.size();
        }
    virtual T Get(long index) const
    {
      return data[index];
    }    
};

template<typename T>
class ConcreteIterator: public Iterator<T>
{
  private:
        const Aggregate<T>* aggregate;
        long current;
  public:
    ConcreteIterator(const Aggregate<T>* myAggregate): //const必须有
      aggregate(myAggregate),current(0) {}
    virtual void First()
        {
                current = 0;
        }
    virtual void Next()
        {
                current ++;
        }
    virtual bool IsDone()
        {
                return current >= aggregate -> Count();
        }
    virtual T CurrentItem() const
    {
        return aggregate -> Get(current);
    }
};

template<typename T>
Iterator<T>* ConcreteAggregate<T>::CreateIterator() const
{
        Iterator<T>* iterator = new ConcreteIterator<T>(this);
    return iterator;
}

int main()
{
    vector<int> myData = {1,2,3,4,5};
    Aggregate<int>* myAggregate = new ConcreteAggregate<int>(myData);
    Iterator<int>* myIterator = myAggregate -> CreateIterator();
     // new ConcreteIterator<int>(myAggregate);
    for (myIterator -> First(); !myIterator -> IsDone(); myIterator -> Next())
    {
      cout << "the current value is " << myIterator -> CurrentItem() << endl;
    }
    return 0;
}

链接

https://github.com/xierensong/learngit/blob/master/DPattern/19/1.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值