C 迭代器iterator的实现原理

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

迭代器的主要优点如下:

  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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html如何在画布上加层,在Canvas中嵌套Html

大概是这样的&#xff0c;现在需要根据一下上传的图片以及一些输入生成图片。本来打算用imagemagick的&#xff0c;但是后来觉得这样前后端要搞两份不同的代码&#xff0c;然后imagemagick使用起来远没有canvas用起来顺手啊。So&#xff0c;最终决定就用Canvas搞定它了&#xf…

如何用illustrator做技术手册_做期货用什么技术指标分析?

来源&#xff1a;期汇股金作者&#xff1a;DC链接&#xff1a;做期货用什么技术指标分析&#xff1f;投资期货市场首先我们要有一套自己的技术分析&#xff0c;那么我们有什么样的技术指标分析最准确呢&#xff0c;没有最准确的技术指标&#xff0c;要看你运用的程度&#xff0…

根据字符串自动构造对应类

问题的起因是&#xff0c;我在做一个demo&#xff0c;有一个对象基类&#xff0c;以及一堆派生出的子对象&#xff0c;比如球体、立方体之类的对象。还有一个对象管理类&#xff0c;用于存储场景中的所有对象。那么在初始化的时候&#xff0c;代码是这么写的&#xff1a;class …

.sql文件如何执行_mysql:一条SQL查询语句是如何执行的?

本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构。首先有一个 user_info 表&#xff0c;表里有一个 id 字段&#xff0c;执行下面这条查询语句&#xff1a;select * from user_info where id 1;返回结果为&#xff1a;-------------------------------------------…

jooq和jdbc_在jOOQ之上构建的RESTful JDBC HTTP服务器

jooq和jdbcjOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系…

C 虚函数表及多态内部原理详解

C 中的虚函数的作用主要是实现了多态的机制。关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”&#xff0c;这是一种泛型技术。虚函数表每个含有虚函数的类都…

numpy 平方_NumPy入门指南

本文介绍了NumPy的基础知识&#xff0c;NumPy是使用Python进行科学计算的软件包。我们将在此处介绍几类基本的数组操作&#xff1a; 创建NumPy数组 重塑数组 NumPy的数学运算 数组的索引和切片 遍历数组首先&#xff0c;让我们将NumPy导入为np。 这使我们可以使用快捷方式np来引…

android 揭示动画_揭示垃圾收集暂停的时间长度

android 揭示动画有几种方法可以改善您的产品。 一种这样的方法是仔细跟踪用户的体验并在此基础上进行改进。 我们确实自己应用了此技术&#xff0c;并再次花了一些时间查看不同的数据 除了我们追求的许多其他方面之外&#xff0c;我们还提出了一个问题“延迟GC触发应用程序的…

10 张程序员喜爱的壁纸,需要自取~

喜欢的话就请点个再看&#xff0c;分享到朋友圈吧~

iptables 开放远程_JavaWeb项目的部署以及远程调试

不点蓝字&#xff0c;我们哪来故事&#xff1f;Linux环境下软件的安装Linux环境下的程序的安装、更新、卸载和查看。rpm 命令&#xff1a;相当于windows程序的添加/卸载程序&#xff0c;进程程序的安装&#xff0c;查看&#xff0c;卸载。本地程序安装&#xff1a;rpm -ivh 程序…

java 性能调优_Java性能调优调查结果(第一部分)

java 性能调优我们在2014年10月进行了Java性能调优调查。该调查的主要目的是收集对Java性能世界的见解&#xff0c;以改善Plumbr产品。 但是&#xff0c;我们也很高兴与您分享有趣的结果。 我们收集的数据为进行冗长的分析提供了素材&#xff0c;因此我们决定将结果划分为一系列…

通过反汇编来理解restrict关键字

一次难忘的面试经历多年前&#xff0c;一次互联网某厂实习生的面试题&#xff0c;题目的代码片段很简单&#xff0c;如下&#xff1a;1 #include 2 int main()3 {4 int *restrict pInt (int*)malloc(4);5 int *pNewInt pInt;6 return 0;7 } 12345678面试官问…

python车牌识别系统开源代码_汽车牌照识别系统【YOLO+MLP】

车牌识别系统可以自动检测并识别图像中的车辆牌照&#xff0c;其算法主要包括牌照定位、牌照分割、字符识别等步骤。本文将给出一种基于深度学习的车牌识别系统方案。要快速掌握开发人工智能系统的技能&#xff0c;推荐汇智网的 机器学习系列在线课程由于可以自动地从视频图像中…

js text 和 html,JS DOM innerText和textContent的区别

innerText和textContent很多人会困惑&#xff0c;因为都可以用来获取文本内容&#xff0c;实际上&#xff0c;两者还是有很多区别的&#xff0c;本文就将介绍这两个属性的异同&#xff0c;希望可以对大家的学习有所帮助。一、之前错误的认识innerText IE6就开始支持&#xff0c…

如何用耳机翻页_游戏耳机的经典之作—罗技(G)Astro A40体验

前言经常去网吧玩游戏的朋友&#xff0c;在家玩如果没有头戴式耳机&#xff0c;那体验真的会差一大截。优秀的电竞游戏耳机会带来更好的游戏体验&#xff0c;不仅是舒适性。像绝地求生这类FPS游戏&#xff0c;游戏耳机会让听声辩位更容易更精确。最近因为大促降价入手的罗技&am…

我改了500个Bug,但是!!

IT程序猿 微博网友评论&#xff1a;空白一页blank&#xff1a;不写bug怎么改bug 抠Bee&#xff1a;不经意间病毒都出来了我在海的这边你在哪里丫&#xff1a;好了&#xff0c;发给开发小弟了富贵小小神仙&#xff1a;要不然呢&#xff0c;那些从开发到维护的程序员不都是靠这么…

globalmapper如何选取图像上的点_OpenCV 进阶应用,用编程手段搞定图像处理

在我们生活中&#xff0c;常见的图像处理软件有Adobe Photoshop、Adobe Illustrator等。然而&#xff0c;并非只有软件才能实现图像处理&#xff0c;通过编程手段也是能实现的&#xff01;通过编程手段实现图像处理&#xff0c;也就是计算机视觉。所谓计算机视觉&#xff0c;就…

pytorch relu函数实现_什么是pytorch?

PyTorch是一个&#xff1a;机器学习框架&#xff0c;简单易学可以看做是支持GPU计算和自动微分计算的“Numpy”库支持100多种Tensor常规算子&#xff0c;包括&#xff1a;创建、索引、切片、转置、连接、随机数、形状改变&#xff0c;线性代数、数学计算Tensor是一个有值有属性…

C sort 排序函数用法

最近在刷ACM经常用到排序&#xff0c;以前老是写冒泡&#xff0c;可把冒泡带到OJ里后发现经常超时&#xff0c;所以本想用快排&#xff0c;可是很多学长推荐用sort函数&#xff0c;因为自己写的快排写不好真的没有sort快&#xff0c;所以毅然决然选择sort函数用法1、sort函数可…

python人脸_Python 使用 face_recognition 人脸识别

Python 使用 face_recognition 人脸识别 人脸识别 face_recognition 是世界上最简单的人脸识别库。 使用 dlib 最先进的人脸识别功能构建建立深度学习&#xff0c;该模型准确率在99.38%。 Python模块的使用 Python可以安装导入 face_recognition 模块轻松操作&#xff0c;对于简…