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迭代器的源码. ...
随机推荐
- spring事物的传播行为及隔离
关于@Transactional注解: 添加事务注解1.使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时如何使用事务, 默认取值为 REQUIRED, 即使 ...
- maven 跳过test
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...
- 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle. 很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面. ...
- ThinkPHP中where()使用方法详解
where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...
- django----用户认证(auth模块)
用法 from django.contrib import auth user = authenticate(username='someone',password='somepassword') l ...
- python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)
先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...
- 基于bootstrap的基本模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- spoj694
题意:求不相同的子串个数 题解: 考虑一下后缀数组 yy一下就能发现答案就是n*(n+1)/2-sigma(i=1;i<=n;i++)height[i] 代码:
- 6-4 破碎的键盘 uva11988
基础的数组链表 用cur标记光标之前的 用last标记最后的十分巧妙 数组开的不够大会引起RE!! next[0]=0:这使得最后一项所指的为0 核心语句: next[i]=next[cur] ne ...
- 【Java】 剑指offer(48) 最长不含重复字符的子字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字 ...