找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3712|回复: 0

迭代器iterator在程序到底起什么作用? |YEYUANGEN

[复制链接]
发表于 2011-12-14 14:03:15 | 显示全部楼层 |阅读模式
1.类似于一个指针,但不是指针
2.在container中相当于指向element的指针,但其实现并不是指针,而是对象。
3.从大的方面讲是容器和算法之间的黏合剂
从小的方面讲是类似智能指针的东东

试一下copy算法来加深理解
:)
4.iterator相当于一个container的指针类型,可以定义一个对象对container中的每个元素进行连续的访问。
5.你看一下源代码很快就明白了。我原来也晕了半天,实际就是指针,通过typedef实现。
  1. template <class   
  2. T>   class   XXX
  3. {
  4.       ...
  5.       ...
  6.       typedef   T*   
  7. iterator
  8.       typedef   const   T*   const_iterator;
  9. };
复制代码
建议:看C++ primer加深理解
源码参考:

实现:
  1. 1)Iterator.h
  2. #ifndef ITERATOR_H
  3. #define ITERATOR_H
  4. typedef int DATA;
  5. class Iterater;
  6. // 容器的抽象基类
  7. class Aggregate
  8. {
  9. public:
  10.     virtual ~Aggregate(){}
  11.     virtual Iterater* CreateIterater(Aggregate *pAggregate) = 0;
  12.     virtual int GetSize() = 0;
  13.     virtual DATA GetItem(int nIndex) = 0;
  14. };
  15. // 迭代器的抽象基类
  16. class Iterater
  17. {
  18. public:
  19.     virtual ~Iterater(){}
  20.     virtual void First()        = 0;
  21.     virtual void Next()            = 0;
  22.     virtual bool IsDone()        = 0;
  23.     virtual DATA CurrentItem()    = 0;
  24. private:
  25. };
  26. // 一个具体的容器类,这里是用数组表示
  27. class ConcreateAggregate
  28.     : public Aggregate
  29. {
  30. public:
  31.     ConcreateAggregate(int nSize);
  32.     virtual ~ConcreateAggregate();
  33.     virtual Iterater* CreateIterater(Aggregate *pAggregate);
  34.     virtual int GetSize();
  35.     virtual DATA GetItem(int nIndex);
  36. private:
  37.     int m_nSize;
  38.     DATA *m_pData;
  39. };
  40. // 访问ConcreateAggregate容器类的迭代器类
  41. class ConcreateIterater
  42.     : public Iterater
  43. {
  44. public:
  45.     ConcreateIterater(Aggregate* pAggregate);
  46.     virtual ~ConcreateIterater(){}
  47.     virtual void First();
  48.     virtual void Next();
  49.     virtual bool IsDone();
  50.     virtual DATA CurrentItem();
  51. private:
  52.     Aggregate  *m_pConcreateAggregate;
  53.     int            m_nIndex;
  54. };
  55. #endif
  56. 复制代码
  57. 2)Iterator.cpp
  58. #include <iostream>
  59. #include "Iterator.h"
  60. ConcreateAggregate::ConcreateAggregate(int nSize)
  61.     : m_nSize(nSize)
  62.     , m_pData(NULL)
  63. {
  64.     m_pData = new DATA[m_nSize];
  65.    
  66.     for (int i = 0; i < nSize; ++i)
  67.     {
  68.         m_pData[i] = i;
  69.     }
  70. }
  71. ConcreateAggregate::~ConcreateAggregate()
  72. {
  73.     delete [] m_pData;
  74.     m_pData = NULL;
  75. }
  76. Iterater* ConcreateAggregate::CreateIterater(Aggregate *pAggregate)
  77. {
  78.     return new ConcreateIterater(this);
  79. }
  80. int ConcreateAggregate::GetSize()
  81. {
  82.     return m_nSize;
  83. }
  84. DATA ConcreateAggregate::GetItem(int nIndex)
  85. {
  86.     if (nIndex < m_nSize)
  87.     {
  88.         return m_pData[nIndex];
  89.     }
  90.     else
  91.     {
  92.         return -1;
  93.     }
  94. }
  95. ConcreateIterater::ConcreateIterater(Aggregate* pAggregate)
  96.     : m_pConcreateAggregate(pAggregate)
  97.     , m_nIndex(0)
  98. {
  99. }
  100. void ConcreateIterater::First()
  101. {
  102.     m_nIndex = 0;
  103. }
  104. void ConcreateIterater::Next()
  105. {
  106.     if (m_nIndex < m_pConcreateAggregate->GetSize())
  107.     {
  108.         ++m_nIndex;
  109.     }
  110. }
  111. bool ConcreateIterater::IsDone()
  112. {
  113.     return m_nIndex == m_pConcreateAggregate->GetSize();
  114. }
  115. DATA ConcreateIterater::CurrentItem()
  116. {
  117.     return m_pConcreateAggregate->GetItem(m_nIndex);
  118. }
  119. //复制代码
  120. 3_Main.cpp
  121. #include "Iterator.h"
  122. #include <iostream>
  123. int main()
  124. {
  125.     Aggregate* pAggregate = new ConcreateAggregate(4);
  126.     Iterater*  pIterater  = new ConcreateIterater(pAggregate);
  127.     for (; false == pIterater->IsDone(); pIterater->Next())
  128.     {
  129.         std::cout << pIterater->CurrentItem() << std::endl;
  130.     }
  131.     return 0;
  132. }
复制代码
复制代码
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 16:02 , Processed in 0.018063 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表