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() = ;
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
C++泛型编程(1)--自己实现C++迭代器/遍历器 iterator的更多相关文章
- Java List中迭代器遍历
在java中,List接口从Collection接口中继承了 iterator()函数,返回值是一个T类型的迭代器(泛型),T是List中元素的类型 public class TestListAndI ...
- java 迭代器遍历List Set Map
Iterator接口: 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现Iterator接口的对象 Iterator对象称作为迭代器,用以方便的对容器内元素的遍历 ...
- Iterator、for..of,for...in和自定义遍历器**
Iterator.for..of,for...in和自定义遍历器 Iterator: var arr = [1,2,3,4,5]; var ite = arr[Symbol.iterator](); ...
- ES6的 Iterator 遍历器到底是什么?
这节课要讲的是ES6中的Iterator. for...of为啥不遍历Object对象 第十三节我们讲了简单又实用的for...of,我们可以使用它来遍历数组,字符串,Set和Map结构,但是有没有发 ...
- Java基础知识强化之集合框架笔记07:Collection集合的遍历之迭代器遍历
1. Collection的迭代器: Iterator iterator():迭代器,集合的专用遍历方式 2. 代码示例: package cn.itcast_03; import java.util ...
- Redis Scan迭代器遍历操作原理(一)
Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了··· 命令的官方介绍在这里, 中文版由huangz同学细心翻译了, ...
- Redis Scan迭代器遍历操作原理(二)
续上一篇文章 Redis Scan迭代器遍历操作原理(一)–基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分). 关于这个算法的源头,来自 ...
- Java 中List 集合索引遍历与迭代器遍历
package yzhou.iterator; import java.util.ArrayList; import java.util.HashSet; import java.util.Itera ...
- 有关map中使用iterate迭代器遍历的不保序问题和list remove(object)的细节问题
今天在做项目的过程中发现了如下两个问题: 一 使用map的iterator迭代器对map进行遍历得到的结果是不保序的,也就是每次输出结果都是不一样的.针对这个问题,看以下iterator迭代器的源码. ...
随机推荐
- 源码编译安装mysql5.5.33
源码编译安装mysql5.5.33 一.安装cmake编译工具 跨平台编译器 # yum install -y gcc* # yum install -y cmake 解决依赖关系 # yum ins ...
- Ex 6_18 硬币有限的兑换问题_第七次作业
子问题定义: 定义一个二维数组b,其中b[i][j]表示前i个币种是否能兑换价格j,表示第i个币种的面值,第i个币种的使用有两种情况,若使用,则b[i][j]=b[i-1][j-],若不使用,则b[i ...
- spring整合strus2的Hellowworld
比较笨,看了三遍才能理解敲对并正确运行: step: 1.建立web工程( Dynamic Web project)一定要勾上创建web.xml 2.导入jar包 这个就比较坑了,我查了有半个小时才查 ...
- PYTHON-流程控制之if/while/for
内容: 流程控制: 1. if 2. while 3. for ==================================流程控制之if判断 1 什么是if判断 判断一个条件如果成立则做.. ...
- AndroidStudio中builde.gradle文件详解
Android Studio是采用Gradle来构建项目的,一个Android项目中包含两个build.gradle文件,如下图: (1)最外层目录下build.gradle文件 最外层目录下 ...
- Coursera台大机器学习技法课程笔记05-Kernel Logistic Regression
这一节主要讲的是如何将Kernel trick 用到 logistic regression上. 从另一个角度来看soft-margin SVM,将其与 logistic regression进行对比 ...
- MySQL 5.6.26几种安装包的区别
一.MySQL Installer 5.6.26 mysql-installer-community-5.6.26.0.msi, 364.2MBMySQL Installer 提供了简单易用.向导式的 ...
- 如何通过编译Linux内核打开IPVS(LVS)的debug模式
前言 为了定位keepalived VIP的问题, 一步一步定位到IPVS, IPVS默认是没有打开Debug模式的, 若需要打开Debug模式需要重新编译IPVS模块加载后才行, 最好的方式当然是仅 ...
- ThinkPHP中where()使用方法详解
where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...
- Linux学习笔记(Ubuntu操作系统)之hadoop学习之路
1:检查虚拟机的ip命令:ifconfig 2:普通用户切换root用户命令:su 3:root用户切换普通用户命令:su 用户名 4:普通用户执行系统执行前面加命令:sudo 5:查询主机名命令:h ...