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() = ;
virtual void next() = ;
virtual bool isDone() = ;
virtual T currentItem() = ;
}; // 容器基类
template<typename T>
class Aggregate {
public:
virtual ~Aggregate() {
}
virtual Iterater<T>* createIterater() = ;
virtual int getSize() = ;
virtual T getItem(int nIndex) = ;
}; // 具体迭代器
template<typename T>
class ConcreateIterater : public Iterater<T> {
private:
Aggregate<T>* p_;
int cur_index_; public:
ConcreateIterater(Aggregate<T>* agregate)
: cur_index_(),
p_(agregate) {
} ~ConcreateIterater() {
} void first() {
cur_index_ = ;
} void next() {
if (cur_index_ < p_->getSize()) {
cur_index_++;
}
} bool isDone() {
if (cur_index_ > p_->getSize() - ) {
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 = ; i < nSize; i++) {
data_[i] = i;
}
} Iterater<T>* createIterater() {
return new ConcreateIterater<T>(this);
} int getSize() {
return size_;
} T getItem(int nIndex) {
if (nIndex < || nIndex >= size_)
return (T) (-);
return data_[nIndex];
}
public:
int size_;
T* data_;
}; int main(int argc, char** argv) {
Aggregate<double>* pag = new ConcreateAggregate<double>();
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 ;
}
3.结果
all value:
value:
value:
value:
value:
value:
value:
value:
value:
value:
value:
all value:value:0value:1value:2value:3value:4value:5value:6value:7value:8value:9