Iterator(迭代器)
Posted 46cxf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Iterator(迭代器)相关的知识,希望对你有一定的参考价值。
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(迭代器)的主要内容,如果未能解决你的问题,请参考以下文章