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

打印 上一主题 下一主题

主题 997|帖子 997|积分 2991

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
链接:C++ 计划模式
链接:C++ 计划模式 - 组合模式
链接:C++ 计划模式 - 职责链模式
迭代器模式(Iterator Pattern)是一种行为型计划模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式使得我们可以遍历差别范例的聚集对象,而无需相识其底层实现。
1. 问题分析

在开辟中,我们经常需要遍历聚集对象(如数组、列表、树等)中的元素。差别聚集对象的内部实现可能差别,但我们渴望能够以同等的方式遍历它们,而不需要相识其内部结构。
迭代器模式通过提供一个同一的接口来遍历聚集对象,使得客户端代码可以同等地访问差别范例的聚集对象。迭代器模式将遍历操作封装在迭代器对象中,从而将聚集对象的遍历与聚集对象的实现分离。
2.实现步调


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

3.1.定义迭代器接口

  1. template <typename T>
  2. class Iterator {
  3. public:
  4.   virtual ~Iterator() {}
  5.   virtual bool hasNext() = 0;
  6.   virtual T next() = 0;
  7. };
复制代码
3.2.实现具体迭代器

  1. template <typename T>
  2. class ConcreteIterator : public Iterator<T> {
  3. public:
  4.   ConcreteIterator(const std::vector<T>& collection) : collection(collection), index(0) {}
  5.   bool hasNext() override { return index < collection.size(); }
  6.   T next() override { return collection[index++]; }
  7. private:
  8.   std::vector<T> collection;
  9.   size_t index;
  10. };
复制代码
3.3.定义聚集接口

  1. template <typename T>
  2. class IterableCollection {
  3. public:
  4.   virtual ~IterableCollection() {}
  5.   virtual Iterator<T>* createIterator() = 0;
  6. };
复制代码
3.4.实现具体聚集

  1. template <typename T>
  2. class ConcreteCollection : public IterableCollection<T> {
  3. public:
  4.   void addItem(const T& item) { collection.push_back(item); }
  5.   Iterator<T>* createIterator() override { return new ConcreteIterator<T>(collection); }
  6. private:
  7.   std::vector<T> collection;
  8. };
复制代码
3.5.客户端代码

  1. int main() {
  2.   ConcreteCollection<int> collection;
  3.   collection.addItem(1);
  4.   collection.addItem(2);
  5.   collection.addItem(3);
  6.   Iterator<int>* iterator = collection.createIterator();
  7.   while (iterator->hasNext()) {
  8.     std::cout << iterator->next() << " ";
  9.   }
  10.   std::cout << std::endl;
  11.   delete iterator;
  12.   return 0;
  13. }
复制代码
4.STL

在现代C++编程中,标准模板库(STL)提供了强大且机动的迭代器机制,极大地简化了聚集对象的遍历操作。因此,STL中的迭代器在很大水平上取代了手动实现的迭代器模式。
示例:遍历std::vector
  1. int main() {
  2.   std::vector<int> vec = {1, 2, 3, 4, 5};
  3.   // 使用迭代器遍历vector
  4.   for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
  5.     std::cout << *it << " ";
  6.   }
  7.   std::cout << std::endl;
  8.   // 使用范围for循环遍历vector
  9.   for (int value : vec) {
  10.     std::cout << value << " ";
  11.   }
  12.   std::cout << std::endl;
  13.   return 0;
  14. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表