C++叠代器/遍歷器 iterator實現
阿新 • • 發佈:2017-11-01
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實現