1. 程式人生 > >C++叠代器/遍歷器 iterator實現

C++叠代器/遍歷器 iterator實現

tex line his ace log 和數 ont bool item

1.原理

叠代器又稱為遍歷器,用於訪問容器中的數據,叠代器旨在算法和容器之間搭建訪問的橋梁,從而使算法和數據分離,不用關心數據具體的存儲細節。具體的原理描述請參考以下兩個博客:

[1].C++叠代器 iterator

[2].Iterator模式C++實現

叠代器的UML圖:

技術分享

(來自:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/25/1764934.html)

2.實現

根據以上的原理圖,下面實現一個簡單的叠代器。

/*
 * 以下實現了一個容器的叠代器(訪問器)
 */
#include <boost/assert.hpp>
#include 
<iostream> using namespace std; // 叠代器基類 template<typename T> class Iterater { public: virtual ~Iterater() { } virtual void first() = 0; virtual void next() = 0; virtual bool isDone() = 0; virtual T currentItem() = 0; }; // 容器基類 template<typename T> class Aggregate { public
: virtual ~Aggregate() { } virtual Iterater<T>* createIterater() = 0; virtual int getSize() = 0; virtual T getItem(int nIndex) = 0; }; // 具體叠代器 template<typename T> class ConcreateIterater : public Iterater<T> { private: Aggregate<T>* p_; int cur_index_; public: ConcreateIterater(Aggregate
<T>* agregate) : cur_index_(0), p_(agregate) { } ~ConcreateIterater() { } void first() { cur_index_ = 0; } void next() { if (cur_index_ < p_->getSize()) { cur_index_++; } } bool isDone() { if (cur_index_ > p_->getSize() - 1) { return true; } return false; } T currentItem() { return p_->getItem(cur_index_); } }; // 具體叠代器 template<typename T> class ConcreateAggregate : public Aggregate<T> { public: ConcreateAggregate(int nSize) : size_(nSize), data_(NULL) { data_ = new T[nSize]; for (int i = 0; i < nSize; i++) { data_[i] = i; } } Iterater<T>* createIterater() { return new ConcreateIterater<T>(this); } int getSize() { return size_; } T getItem(int nIndex) { if (nIndex < 0 || nIndex >= size_) return (T) (-1); return data_[nIndex]; } public: int size_; T* data_; }; int main(int argc, char** argv) { Aggregate<double>* pag = new ConcreateAggregate<double>(10); Iterater<double>* pcon = pag->createIterater(); // 1 of 2 //cxk::Iterater<int>* pcon = new cxk::ConcreateIterater<int>(pag); // 2 of 2 cout << "all value:" << endl; for (pcon->first(); !pcon->isDone(); pcon->next()) { cout << "value:" << pcon->currentItem() << endl; } return 0; }

3.結果

all value:
value:0
value:1
value:2
value:3
value:4
value:5
value:6
value:7
value:8
value:9

all value:value:0value:1value:2value:3value:4value:5value:6value:7value:8value:9

C++叠代器/遍歷器 iterator實現