C++泛型編程(1)--自己實現C++迭代器/遍歷器 iterator


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM