21.迭代器模式

// 迭代器设计模式

// 目的:让你在不暴露集合的底层表示(列表、栈、树等)的情况下遍历集合的元素。

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

/**
 * C++有自己的迭代器实现,可以与标准库定义的不同的泛型容器一起工作。
 */

template <typename T, typename U>
class Iterator {
public:
    // 定义一个迭代器类型
    typedef typename std::vector<T>::iterator iter_type;
    // 构造函数,接受一个容器指针和一个反向标志
    Iterator(U* p_data, bool reverse = false) : m_p_data_(p_data) {
        // 将迭代器指向容器的开始位置
        m_it_ = m_p_data_->m_data_.begin();
    }

    // 将迭代器指向容器的开始位置
    void First() {
        m_it_ = m_p_data_->m_data_.begin();
    }

    // 将迭代器向前移动一位
    void Next() {
        m_it_++;
    }

    // 判断是否到达容器的结束位置
    bool IsDone() {
        return (m_it_ == m_p_data_->m_data_.end());
    }

    // 返回当前迭代器指向的元素
    iter_type Current() {
        return m_it_;
    }

private:
    // 容器指针
    U* m_p_data_; //int
    // 迭代器对象
    iter_type m_it_; //Container<int>
};

/**
 * 泛型集合/容器提供了一个或多个方法来获取新的迭代器实例,与集合类兼容。
 */

template <class T>
class Container {
    // 声明友元类,让迭代器可以访问容器的私有成员
    friend class Iterator<T, Container>;

public:
    // 向容器中添加元素
    void Add(T a) {
        m_data_.push_back(a);
    }

    // 创建一个与容器相对应的迭代器对象
    Iterator<T, Container>* CreateIterator() {
        return new Iterator<T, Container>(this);
    }

private:
    // 使用vector来保存数据
    std::vector<T> m_data_;
};

class Data {
public:
    // 构造函数,初始化数据为0或给定值
    Data(int a = 0) : m_data_(a) {}

    // 设置数据值
    void set_data(int a) {
        m_data_ = a;
    }

    // 获取数据值
    int data() {
        return m_data_;
    }

private:
    // 数据成员
    int m_data_;
};

/**
 * 客户端代码可能知道也可能不知道具体的迭代器或集合类,对于这个实现,容器是泛型的,所以你可以用int或自定义类来使用它。
 */
void ClientCode() {
    std::cout << "________________Iterator with int______________________________________" << std::endl;

    // 创建一个int类型的容器对象
    Container<int> cont;

    // 向容器中添加10个int值
    for (int i = 0; i < 10; i++) {
        cont.Add(i);
    }

    // 创建一个int类型的迭代器对象,并关联到容器对象上w
    Iterator<int, Container<int>>* it = cont.CreateIterator();

    // 使用迭代器遍历容器中的所有元素,并打印出来
    for (it->First(); !it->IsDone(); it->Next()) {
        std::cout << *it->Current() << std::endl;
    }

    // 创建一个Data类型的容器对象
    Container<Data> cont2;

    // 创建三个Data对象,并设置不同的值
    Data a(100), b(1000), c(10000);

    // 向容器中添加三个Data对象
    cont2.Add(a);
    cont2.Add(b);
    cont2.Add(c);

    std::cout << "________________Iterator with custom Class______________________________" << std::endl;

    // 创建一个Data类型的迭代器对象,并关联到容器对象上
    Iterator<Data, Container<Data>>* it2 = cont2.CreateIterator();

    // 使用迭代器遍历容器中的所有元素,并打印出它们的数据值
    for (it2->First(); !it2->IsDone(); it2->Next()) {
        std::cout << it2->Current()->data() << std::endl;
    }

    // 释放迭代器对象的内存
    delete it;
    delete it2;
}

int main() {
    // 调用客户端代码
    ClientCode();
    return 0;
}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值