当前位置: 首页 > article >正文

C++ 设计模式:迭代器模式(Iterator Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 组合模式
链接:C++ 设计模式 - 职责链模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式使得我们可以遍历不同类型的集合对象,而无需了解其底层实现。

1. 问题分析

在开发中,我们经常需要遍历集合对象(如数组、列表、树等)中的元素。不同集合对象的内部实现可能不同,但我们希望能够以一致的方式遍历它们,而不需要了解其内部结构。

迭代器模式通过提供一个统一的接口来遍历集合对象,使得客户端代码可以一致地访问不同类型的集合对象。迭代器模式将遍历操作封装在迭代器对象中,从而将集合对象的遍历与集合对象的实现分离。

2.实现步骤

  1. 定义迭代器接口(Iterator):声明遍历元素的方法,如next()、hasNext()等。
  2. 实现具体迭代器类(ConcreteIterator):实现迭代器接口,负责遍历集合对象中的元素。
  3. 定义聚合接口(Aggregate):声明创建迭代器的方法。
  4. 实现具体聚合类(ConcreteAggregate):实现聚合接口,创建具体迭代器对象。

3.代码示例

3.1.定义迭代器接口

template <typename T>
class Iterator {
 public:
  virtual ~Iterator() {}
  virtual bool hasNext() = 0;
  virtual T next() = 0;
};

3.2.实现具体迭代器

template <typename T>
class ConcreteIterator : public Iterator<T> {
 public:
  ConcreteIterator(const std::vector<T>& collection) : collection(collection), index(0) {}

  bool hasNext() override { return index < collection.size(); }

  T next() override { return collection[index++]; }

 private:
  std::vector<T> collection;
  size_t index;
};

3.3.定义集合接口

template <typename T>
class IterableCollection {
 public:
  virtual ~IterableCollection() {}
  virtual Iterator<T>* createIterator() = 0;
};

3.4.实现具体集合

template <typename T>
class ConcreteCollection : public IterableCollection<T> {
 public:
  void addItem(const T& item) { collection.push_back(item); }

  Iterator<T>* createIterator() override { return new ConcreteIterator<T>(collection); }
 private:
  std::vector<T> collection;
};

3.5.客户端代码

int main() {
  ConcreteCollection<int> collection;
  collection.addItem(1);
  collection.addItem(2);
  collection.addItem(3);

  Iterator<int>* iterator = collection.createIterator();
  while (iterator->hasNext()) {
    std::cout << iterator->next() << " ";
  }
  std::cout << std::endl;

  delete iterator;
  return 0;
}

4.STL

在现代C++编程中,标准模板库(STL)提供了强大且灵活的迭代器机制,极大地简化了集合对象的遍历操作。因此,STL中的迭代器在很大程度上取代了手动实现的迭代器模式。

示例:遍历std::vector

int main() {
  std::vector<int> vec = {1, 2, 3, 4, 5};

  // 使用迭代器遍历vector
  for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

  // 使用范围for循环遍历vector
  for (int value : vec) {
    std::cout << value << " ";
  }
  std::cout << std::endl;

  return 0;
}

http://www.kler.cn/a/468317.html

相关文章:

  • TCP Analysis Flags 之 TCP Retransmission
  • 动态规划六——两个数组的dp问题
  • 设计模式之桥接设计模式
  • H3C MPLS跨域optionC
  • Tableau数据可视化与仪表盘搭建-数据连接
  • 命令模式——C++实现
  • ASP.NET Core 下载文件
  • 【全栈】SprintBoot+vue3迷你商城(1)
  • http源码分析
  • Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)
  • 计算机的错误计算(二百零一)
  • 计算机网络--路由器问题
  • [python3]Excel解析库-xlutils
  • AIA - APLIC之三(附APLIC处理流程图)
  • [读书日志]8051软核处理器设计实战(基于FPGA)第四篇:verilog语法特性
  • 任务执行模式全解析:并发、并行、串行与同步、异步的对比
  • Sentinel-5P遥感数据下载及预处理教程【20250105】
  • 每天学一点强化学习(二)
  • 树莓派 Pico RP2040 多核心运行模式 多核编程
  • 圆周率π为何是无穷无尽的