在经典的设计模式中,有一种迭代器模式,定义为:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

迭代器的主要优点如下:

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。

  2. 遍历任务交由迭代器完成,这简化了聚合类。

  3. 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。

  4. 增加新的聚合类和迭代器类都很方便,无须修改原有代码。

  5. 封装性良好,为遍历不同的聚合结构提供一个统一的接口。

使用过STL的童鞋就知道,迭代器是STL使用最多的技术;那么迭代器具体是怎么实现的呢?本文来讨论一下迭代器的原理和相关实现。

1. list类

首先,我们简单的模拟一个单项链表,这个链表可以往表头插入数据,并且返回表头。

1.1 ListItem

首先,我们需要一个ListItem表示每个链表节点,这个声明如下:

namespace BH
{template<typename T>class ListItem;template<typename T>std::ostream& operator<<(std::ostream& out, ListItem& d);template<typename T>class ListItem{public:ListItem(const T& t) : Data(t), Next(nullptr) {}ListItem(T&& t) : Data(std::forward(t)), Next(nullptr) {}template<typename... Types>ListItem(Types&&... args) : Data(std::forward(args)...), Next(nullptr) {}void setnext(ListItem* n){Next = n;}ListItem* next(){return Next;}friend std::ostream& operator<< (std::ostream& out, ListItem& d);private:ListItem* Next;T* Data;};template<typename T>std::ostream& operator<<(std::ostream& out, ListItem& d){out << d.Data;return out;}
}

首先这里构造函数:

  1. 支持普通构造。

  2. 支持移动函数。

  3. 支持参数完美转发。

  4. 友元operator<<,支持数据输出。

对于移动函数可以参考:nktype="2" hasload="1" style="margin: 0px; padding: 0px; color: rgb(87, 107, 149); text-decoration-line: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">C 移动函数原理浅析。

1.2 list类

这个类实现一个链表,支持简单的插入,并且返回头部节点。

namespace BH
{template<typename T>class list{public:list() noexcept : Head(nullptr) {}void push(const T& t){ListItem* Data = new ListItem(t);Data->setnext(Head);Head = Data;}void push(T&& t){ListItem* Data = new ListItem(t);Data->setnext(Head);Head = Data;}template<typename... Types>void emplace(Types&&... args){ListItem* Data = new ListItem(std::forward(args)...);Data->setnext(Head);Head = Data;}ListItem* front(){return Head;}private:ListItem* Head;};
}

如上,为了演示,这个类实现的很简单,只支持push,和front两个操作。

2. iterator

使用过STL都知道,iterator主要是用来遍历容器中的数据节点,那么上面这个list,我们的主要功能是能够不用在外部知道list的实现原理,使用iterator来遍历数据。

所以iterator的主要功能有:

  1. 支持 ,遍历元素。

  2. 支持*,取元素程序。

  3. 支持->,指针操作。

  4. 支持==和!=操作,比较iterator是否到了结尾。

所以这个实现可以如下:

namespace BH
{template <typename T>class ListIter{public:using value_type = T;using reference = T & ;using const_referenct = const T&;using pointer = T * ;using const_pointor = const T*;using size_type = size_t;using difference_type = ptrdiff_t;ListIter(pointer p = nullptr) : Iter(p) {}bool operator==(const ListIter& rhs) const noexcept{return Iter == rhs.Iter;}bool operator!=(const ListIter& rhs) const noexcept{return Iter != rhs.Iter;}ListIter& operator  (){Iter = Iter->next();return *this;}ListIter& operator  (int){value_type tmp = *this;&*this;return tmp;}reference operator*(){return *Iter;}pointer operator->(){return Iter;}private:pointer Iter;};
}

3. 使用

接下来,我们看一下这个iterator如何使用:

int main(int args, char* argv[])
{BH::list<std::string> l;l.push(std::string("hello"));l.push("world");l.push("abcd");l.push("efg");l.push("kmm");BH::ListIter<BH::ListItem<std::string>> iter(l.front());BH::ListIter<BH::ListItem<std::string>> end;while (iter != end){std::cout << *iter << std::endl;iter;}return 0;
}

C 迭代器iterator的实现原理相关推荐

  1. c++迭代器iterator通用吗_C++ 迭代器iterator的实现原理

    来源:CSDN - xdesk 在经典的设计模式中,有一种迭代器模式,定义为:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示. 迭代器的主要优点如下: 访问一个聚合对象的内容 ...

  2. 【java】ConcurrentHashMap遍历 --- 弱一致性的迭代器(Iterator)实现原理

    1.概述 转载:ConcurrentHashMap遍历 - 弱一致性的迭代器(Iterator)实现原理 在 Java并发编程实战(进阶篇) 中分析了 Vector 在迭代过程中对容器进行修改会抛出 ...

  3. java 迭代器的原理_Java集合框架迭代器Iterator实现原理解析

    使用循环遍历集合 普通for循环 for(int i=0;i<10;i++){} 增强for循环 for(String str:list){} 什么是迭代器Iterator Iterator是J ...

  4. 如何得到iterator的当前元素_Java中迭代器Iterator详解

    1.定义 Iterator的定义为:对Collection进行迭代的迭代器,Iterator取代了Java Collection Framework中的Enumeration.Iterator与Enu ...

  5. java for 迭代器_Java基础-迭代器Iterator与语法糖for-each

    迭代器Iterator与语法糖for-each 一.为什么需要迭代器 设计模式迭代器 迭代器作用于集合,是用来遍历集合元素的对象.迭代器不是Java独有的,大部分高级语言都提供了迭代器来遍历集合.实际 ...

  6. Python中生成器generator和迭代器Iterator的使用方法

    一.生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间 2. 生成器的创建方式 第一种只要把一个列表生 ...

  7. 设计模式学习笔记——迭代器(Iterator)模式

    设计模式学习笔记--迭代器(Iterator)模式 @(设计模式)[设计模式, 迭代器模式, iterator, 迭代器] 设计模式学习笔记迭代器Iterator模式 基本介绍 迭代器案例 类图 实现 ...

  8. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  9. 迭代器Iterator接口的作用及其使用

    1. 迭代器Iterator的作用 什么是迭代器? 迭代器: 可以被next()函数调用并不断返回下一个值的对象称之为迭代器(Iterator) 从另一种角度来定义迭代器就是:提供一种方法访问一个容器 ...

最新文章

  1. mybatis与php,浅谈mybatis中的#和$的区别
  2. 生成对抗网络在深度学习中占据非常重要的位置
  3. Win7各版本功能对比
  4. Maven学习笔记(二)
  5. 8086汇编-实验7-制表
  6. python dictionary的遍历
  7. 错误:未启用当前数据库的SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker。...
  8. Cannot obtain the required interface (IID_IDBCreateCommand) from OLE DB provider OraOLEDB.Oracle...
  9. Java面试宝典2013版(11版块1000题)
  10. 笔记本电脑应用商店服务器错误,打开win10商店出错 出现win10商店请稍后重试问题怎么办 - 驱动管家...
  11. 常见的信息收集工具和手段
  12. 用AI给图片上色 在线将黑白照片处理成彩色照片工具(干货)
  13. 误删u盘文档能恢复吗?u盘删除的文件在哪里找回
  14. MATLAB冒号用法
  15. java 前置系统报文通讯方式_银行核心与前置系统的区别
  16. SVG中插入HTML标签
  17. 用python根据当前星期,输出周一到周五的励志语句
  18. java前后端分离框架,SpringCloud开发微服务平台
  19. 利用计算机课堂导入的好处,多媒体教学的好处
  20. r数据处理与echart作图总结

热门文章

  1. 10个步骤的筛选器模式
  2. 怎么简单的锁定文件夹_简单性与鲁棒性–在锁定文件处理中展示
  3. 使用Amazon s3托管您的Maven工件
  4. Java 10:“ var”关键字
  5. 使用RabbitMQ进行消息传递
  6. jpa 关系拥有方_JPA:确定关系的归属方
  7. 什么是JAX-RS注释? (第3部分)
  8. java堆内存和堆外内存_Java堆空间,本机堆和内存问题
  9. java 内联调用深度_Java中内联虚拟方法调用的性能
  10. cometd_CometD:Java Web应用程序的Facebook类似聊天