C++迭代器模式

/**
    《迭代器模式》
    迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。

    迭代器模式的主要思想是将集合的遍历行为抽取为单独的迭代器对象。

    如果你希望代码能够遍历不同的甚至是无法预知的数据结构, 可以使用迭代器模式。
 */

#include <iostream>
#include <vector>
#include <string>

// 迭代器类,使用模板代替继承接口的实体类
template<typename T, typename U>
class Iterator
{
    typedef typename std::vector<T>::iterator iterator_type;

private:
    iterator_type my_it_;   // 迭代器
    U *my_data_p_;          // 集合指针

public:
    Iterator(U *my_data_p, bool reverse = false) : my_data_p_(my_data_p)
    {
        my_it_ = my_data_p_->my_data_.begin();
    }

    void First()
    {
        my_it_ = my_data_p_->my_data_.begin();
    }

    void Next()
    {
        my_it_++;
    }

    bool IsDone()
    {
        return my_it_ == my_data_p_->my_data_.end();
    }

    iterator_type Current()
    {
        return my_it_;
    }
};


// 集合类,使用模板代替继承接口的实体类
template <typename T>
class Container
{
    friend class Iterator<T, Container>;

private:
    std::vector<T> my_data_;

public:
    void Add(T t)
    {
        my_data_.push_back(t);
    }

    Iterator<T, Container> *CreateIterator()
    {
        return new Iterator<T,Container>(this);
    }
};


// 模拟一个类出来
class Data
{
private:
    int my_data_;

public:
    Data(int a = 0) : my_data_(a) {}

    void SetData(int a)
    {
        my_data_ = a;
    }

    int GetData()
    {
        return my_data_;
    }
};

int main()
{
    // 新建一个容器
    // Container<int> container;
    // for (int i = 0; i < 10; ++i)
    // {
    //     container.Add(i);   // 往容器放东西
    // }

    // auto it = container.CreateIterator();
    // for (it->First(); !it->IsDone(); it->Next())
    // {
    //     std::cout << *(it->Current()) << std::endl;
    // }

    Container<Data> container;
    for (int i = 0; i < 10; ++i)
    {
        container.Add(Data(i));
    }
    auto it = container.CreateIterator();
    for (it->First(); !it->IsDone(); it->Next())
    {
        std::cout << (*it->Current()).GetData() << std::endl;
    }
    
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子砰砰枪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值