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

时间: 2024-10-31 14:25:07

C++迭代器/遍历器 iterator实现的相关文章

Iterator接口(遍历器)和for/of循环

只要某个数据结构部署了Iterator接口,就可以使用拓展运算符将其转化为数组. let arr = [...iterator]; var str = 'hello'; [...str] //["h", "e", "l", "l", "o"] yield* 后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口. let generator = function* (){ yield 1; yield* [

Iterator 遍历器

1.遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). 2.Iterator的作用有三个:一是为各种数据结构,提供一个统一的.简便的访问接口:二是使得数据结构的成员能够按某种次序排列:三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费. 3.在ES6中,有些数据结构原生具备Iterator接口(比如数组),即不用任何处理,就

第 14 章 迭代器模式【Iterator Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我C,老大站在背后,赶忙站起来, “王经理,你找我?” 我说. “哦,在看技术呀.有个事情找你谈一下,你到我办公室来一下.” 老大说. 到老大办公室, “是这样,刚刚我在看季报,我们每个项目的支出费用都很高,项目情况复杂,人员情况也不简单,我看着 也有点糊涂,你看,这是我们现在还在开发或者维护的103 个项目,你能不能先把这些项目信息重新打印一份 给我,咱们好查查到

深入浅出设计模式——迭代器模式(Iterator Pattern)

模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我们并不希望在聚合对象的抽象层接口中充斥着各种不同遍历的操作.怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式,这就是迭代器模式所要解决的问题.在迭代器模式中,提供一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义了一个访问该聚合元素的接口,并且可以跟踪当前遍历的

ES6遍历器 生成器 学习整理

遍历器[迭代器](Iterator) 就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). Iterator 的作用有三个: 1.是为各种数据结构,提供一个统一的.简便的访问接口: 2.是使得数据结构的成员能够按某种次序排列: 3.是 ES6 创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费. 示例代码: //迭代器示例 functi

Java基础知识强化之集合框架笔记07:Collection集合的遍历之迭代器遍历

1. Collection的迭代器: 1 Iterator iterator():迭代器,集合的专用遍历方式 2. 代码示例: package cn.itcast_03; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* * Iterator iterator():迭代器,集合的专用遍历方式 * Iterator(迭代器): * Object next():获取元素,并移动

第十二章 遍历器

遍历器(Iterator)的作用是按照指定的顺序来访问一个集合中的所有元素,而不需要了解集合的详细数据结构. 1 概述 1.1 foreach语句 这种遍历方式对任何类型的数据都适用,因为所有数组都继承了.NET类库中定义的类System.Array,而该类继承了接口IEnmerable.在C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable<T>,或者继承了泛型接口IEnumerable<T>的任何一个构造类型,那么称该类型是“可枚举的”

C#设计模式(16)——迭代器模式(Iterator Pattern)

一.引言 在上篇博文中分享了我对命令模式的理解,命令模式主要是把行为进行抽象成命令,使得请求者的行为和接受者的行为形成低耦合.在一章中,将介绍一下迭代器模式.下面废话不多说了,直接进入本博文的主题. 二.迭代器模式的介绍 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的话,集合对象就承担太多的责任了,面向对象设计原则中有一条是单一职责原则,所以我们要尽可能地分离这些职责,用不同的类去

C++ Iterator迭代器介绍及Iterator迭代器用法代码举例

C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代器 描述 input_iterator 提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*). output_iterator 提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*). forward_iterator 可向前移动的,同时具有读写功能的迭代器.同