1.原理

迭代器又称为遍历器,用于访问容器中的数据,迭代器旨在算法和容器之间搭建访问的桥梁,从而使算法和数据分离,不用关心数据具体的存储细节。具体的原理描述请参考以下两个博客:

[1].C++迭代器 iterator

[2].Iterator模式C++实现

迭代器的UML图:

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

2.实现

根据以上的原理图,下面实现一个简单的迭代器。

  1. /*
  2. * 以下实现了一个容器的迭代器(访问器)
  3. */
  4. #include <boost/assert.hpp>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. // 迭代器基类
  9. template<typename T>
  10. class Iterater {
  11. public:
  12. virtual ~Iterater() {
  13. }
  14. virtual void first() = ;
  15. virtual void next() = ;
  16. virtual bool isDone() = ;
  17. virtual T currentItem() = ;
  18. };
  19.  
  20. // 容器基类
  21. template<typename T>
  22. class Aggregate {
  23. public:
  24. virtual ~Aggregate() {
  25. }
  26. virtual Iterater<T>* createIterater() = ;
  27. virtual int getSize() = ;
  28. virtual T getItem(int nIndex) = ;
  29. };
  30.  
  31. // 具体迭代器
  32. template<typename T>
  33. class ConcreateIterater : public Iterater<T> {
  34. private:
  35. Aggregate<T>* p_;
  36. int cur_index_;
  37.  
  38. public:
  39. ConcreateIterater(Aggregate<T>* agregate)
  40. : cur_index_(),
  41. p_(agregate) {
  42. }
  43.  
  44. ~ConcreateIterater() {
  45. }
  46.  
  47. void first() {
  48. cur_index_ = ;
  49. }
  50.  
  51. void next() {
  52. if (cur_index_ < p_->getSize()) {
  53. cur_index_++;
  54. }
  55. }
  56.  
  57. bool isDone() {
  58. if (cur_index_ > p_->getSize() - ) {
  59. return true;
  60. }
  61. return false;
  62. }
  63.  
  64. T currentItem() {
  65. return p_->getItem(cur_index_);
  66. }
  67. };
  68.  
  69. // 具体迭代器
  70. template<typename T>
  71. class ConcreateAggregate : public Aggregate<T> {
  72. public:
  73. ConcreateAggregate(int nSize)
  74. : size_(nSize),
  75. data_(NULL) {
  76. data_ = new T[nSize];
  77. for (int i = ; i < nSize; i++) {
  78. data_[i] = i;
  79. }
  80. }
  81.  
  82. Iterater<T>* createIterater() {
  83. return new ConcreateIterater<T>(this);
  84. }
  85.  
  86. int getSize() {
  87. return size_;
  88. }
  89.  
  90. T getItem(int nIndex) {
  91. if (nIndex < || nIndex >= size_)
  92. return (T) (-);
  93. return data_[nIndex];
  94. }
  95. public:
  96. int size_;
  97. T* data_;
  98. };
  99.  
  100. int main(int argc, char** argv) {
  101. Aggregate<double>* pag = new ConcreateAggregate<double>();
  102. Iterater<double>* pcon = pag->createIterater(); // 1 of 2
  103. //cxk::Iterater<int>* pcon = new cxk::ConcreateIterater<int>(pag); // 2 of 2
  104. cout << "all value:" << endl;
  105. for (pcon->first(); !pcon->isDone(); pcon->next()) {
  106. cout << "value:" << pcon->currentItem() << endl;
  107. }
  108.  
  109. return ;
  110. }

 3.结果

  1. all value:
  2. value:
  3. value:
  4. value:
  5. value:
  6. value:
  7. value:
  8. value:
  9. value:
  10. value:
  11. value:

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

C++泛型编程(1)--自己实现C++迭代器/遍历器 iterator的更多相关文章

  1. Java List中迭代器遍历

    在java中,List接口从Collection接口中继承了 iterator()函数,返回值是一个T类型的迭代器(泛型),T是List中元素的类型 public class TestListAndI ...

  2. java 迭代器遍历List Set Map

    Iterator接口: 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现Iterator接口的对象 Iterator对象称作为迭代器,用以方便的对容器内元素的遍历 ...

  3. Iterator、for..of,for...in和自定义遍历器**

    Iterator.for..of,for...in和自定义遍历器 Iterator: var arr = [1,2,3,4,5]; var ite = arr[Symbol.iterator](); ...

  4. ES6的 Iterator 遍历器到底是什么?

    这节课要讲的是ES6中的Iterator. for...of为啥不遍历Object对象 第十三节我们讲了简单又实用的for...of,我们可以使用它来遍历数组,字符串,Set和Map结构,但是有没有发 ...

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

    1. Collection的迭代器: Iterator iterator():迭代器,集合的专用遍历方式 2. 代码示例: package cn.itcast_03; import java.util ...

  6. Redis Scan迭代器遍历操作原理(一)

    Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了··· 命令的官方介绍在这里, 中文版由huangz同学细心翻译了, ...

  7. Redis Scan迭代器遍历操作原理(二)

    续上一篇文章 Redis Scan迭代器遍历操作原理(一)–基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分). 关于这个算法的源头,来自 ...

  8. Java 中List 集合索引遍历与迭代器遍历

    package yzhou.iterator; import java.util.ArrayList; import java.util.HashSet; import java.util.Itera ...

  9. 有关map中使用iterate迭代器遍历的不保序问题和list remove(object)的细节问题

    今天在做项目的过程中发现了如下两个问题: 一 使用map的iterator迭代器对map进行遍历得到的结果是不保序的,也就是每次输出结果都是不一样的.针对这个问题,看以下iterator迭代器的源码. ...

随机推荐

  1. spring事物的传播行为及隔离

    关于@Transactional注解: 添加事务注解1.使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时如何使用事务, 默认取值为 REQUIRED, 即使 ...

  2. maven 跳过test

    -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...

  3. 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

    有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle. 很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面. ...

  4. ThinkPHP中where()使用方法详解

    where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...

  5. django----用户认证(auth模块)

    用法 from django.contrib import auth user = authenticate(username='someone',password='somepassword') l ...

  6. python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)

    先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...

  7. 基于bootstrap的基本模板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. spoj694

    题意:求不相同的子串个数 题解: 考虑一下后缀数组 yy一下就能发现答案就是n*(n+1)/2-sigma(i=1;i<=n;i++)height[i] 代码:

  9. 6-4 破碎的键盘 uva11988

    基础的数组链表 用cur标记光标之前的  用last标记最后的十分巧妙 数组开的不够大会引起RE!! next[0]=0:这使得最后一项所指的为0 核心语句: next[i]=next[cur] ne ...

  10. 【Java】 剑指offer(48) 最长不含重复字符的子字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字 ...