码迷,mamicode.com
首页 > 其他好文 > 详细

Iterator(迭代器)

时间:2020-11-08 17:57:34      阅读:33      评论:0      收藏:0      [点我收藏+]

标签:cout   sys   数据   实现   pop   size   不同的   抽象   完成   

17. Iterator(迭代器)

17.1 定义

  提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节

17.2 优点

  ■它支持以不同的方式遍历一个聚合对象。

  ■迭代器简化了聚合类。

  ■在同一个聚合上可以有多个遍历。

  ■在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

17.3 缺点

  ■由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

17.4 使用场景

  ■访问一个聚合对象的内容而无须暴露它的内部表示。

  ■需要为聚合对象提供多种遍历方式。

  ■为遍历不同的聚合结构提供一个统一的接口。

17.5 c++源码实例

  1 #include <iostream>
  2 #include <string>
  3 #include <vector>
  4 using namespace std;
  5 
  6 //抽象迭代角色:该角色负责定义访问和遍历元素的接口。
  7 class Iterator
  8 {
  9 public:
 10     Iterator(){}
 11     virtual ~Iterator(){};
 12     virtual string First() = 0;
 13     virtual string Next() = 0;
 14     virtual string GetCur() = 0;
 15     virtual bool IsEnd() = 0;
 16 };
 17 
 18 //抽象聚合角色:该角色提供创建迭代器角色的接口。
 19 class Aggregate
 20 {
 21 public:
 22     virtual int Count() = 0;
 23     virtual void Push(const string &strValue) = 0;
 24     virtual string POp(const int cnt) = 0;
 25 };
 26 
 27 //具体迭代角色:该角色实现Iterator接口,完成容器元素的遍历。
 28 class ConcreteIterator : public Iterator
 29 {
 30 public:
 31     ConcreteIterator(Aggregate *p_aggregate):m_aggregate(p_aggregate),m_cnt(0){}
 32 
 33     string First()
 34     {
 35         return m_aggregate->POp(0);
 36     }
 37 
 38     string Next()
 39     {
 40         string str;
 41         m_cnt++;
 42         if (m_cnt < m_aggregate->Count())
 43         {
 44             str = m_aggregate->POp(m_cnt);
 45         }
 46 
 47         return str;
 48     }
 49 
 50     string GetCur()
 51     {
 52         return m_aggregate->POp(m_cnt);
 53     }
 54 
 55     bool IsEnd()
 56     {
 57         return m_cnt >= m_aggregate->Count() ? true : false;
 58     }
 59 
 60     ~ConcreteIterator(){ }
 61 
 62 private:
 63     Aggregate *m_aggregate;
 64     int m_cnt;
 65 };
 66 
 67 //具体聚集角色:该角色实现抽象聚集接口,创建出容纳迭代器的对象
 68 class ConcreteAggregate : public Aggregate
 69 {
 70 public:
 71     ConcreteAggregate()
 72     {
 73         m_vecItem.clear();
 74     }
 75 
 76     ~ConcreteAggregate()
 77     {
 78     }
 79 
 80     int Count()
 81     {
 82         return m_vecItem.size();
 83     }
 84 
 85     void Push(const string &strValue)
 86     {
 87         m_vecItem.push_back(strValue);
 88     }
 89 
 90     string POp(const int cnt)
 91     {
 92         string str;
 93         if (cnt < Count())
 94         {
 95             str = m_vecItem[cnt];
 96         }
 97         return str;
 98     }
 99 
100 private:
101     vector<string> m_vecItem;
102 };
103 
104 int main()
105 {
106     ConcreteAggregate* pName = NULL;
107     pName = new ConcreteAggregate();
108     if (NULL != pName)
109     {
110         pName->Push("hello");
111         pName->Push("word");
112         pName->Push("cxue");
113     }
114 
115     Iterator* iter = new ConcreteIterator(pName);
116 
117     if (NULL != iter)
118     {
119         string strItem = iter->First();
120         while (!iter->IsEnd())
121         {
122             cout << iter->GetCur() << " is ok" << endl;
123             iter->Next();
124         }
125     }
126 
127     delete iter;
128     iter = NULL;
129 
130     system("pause");
131 
132     return 0;
133 }

 

Iterator(迭代器)

标签:cout   sys   数据   实现   pop   size   不同的   抽象   完成   

原文地址:https://www.cnblogs.com/46cxf/p/13944203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!