c++迭代器iterator通用吗_C++ 迭代器iterator的实现原理
来源:CSDN - xdesk
在经典的设计模式中,有一种迭代器模式,定义为:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
迭代器的主要优点如下:
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 遍历任务交由迭代器完成,这简化了聚合类。
- 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
- 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
- 封装性良好,为遍历不同的聚合结构提供一个统一的接口。
使用过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 < return out; }}
首先这里构造函数:
- 支持普通构造。
- 支持移动函数。
- 支持参数完美转发。
- 友元
operator<<
,支持数据输出。
对于移动函数可以参考: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的主要功能有:
- 支持++,遍历元素。
- 支持*,取元素程序。
- 支持->,指针操作。
- 支持==和!=操作,比较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<:listitem>std::string>> iter(l.front()); BH::ListIter<:listitem>std::string>> end;while (iter != end) {std::cout <std::endl; ++iter; }return 0;}
输出:
kmmefgabcdworldhello
4. 总结
从网上找了一个迭代器模式的UML类图,如下:
迭代器的主要作用是提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。通用STL的迭代器的作用也是如此,我们在使用STL的时候,不用关系vector,map,set,unordered_map的实现底层原理,使用迭代器,我们就可以遍历容器的节点数据了。
c++迭代器iterator通用吗_C++ 迭代器iterator的实现原理相关推荐
- c++迭代器iterator通用吗_「ES6基础」迭代器(iterator)
迭代器(iterator)是一个结构化的模式,用于从源以一次一个的方式提取数据.迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与 ...
- java 迭代器的hasnext,在Python迭代器中具有hasNext?
Python迭代器是否没有hasNext方法? 相关:我如何知道一开始发电机是否为空? 使用next(iterator, default_value)可以替代StopIteration. 例如: &g ...
- python的迭代器无法输出值_python迭代器和生成器
人生还早,谁能笑到最后呢,坚持吧! 1.迭代器协议 由于生成器自动实现了迭代器协议,我们有必要了解迭代器协议是什么,才能更好的理解生成器. 1)迭代器协议:对象要提供__next()__方法,它要么返 ...
- C++中vector章节iterator与const_iterator及const iterator区别
C++目前倾向于使用迭代器遍历容器中的元素,而不是使用下标访问的方式来访问容器中的元素. 可以使用iterator和const_iterator来访问元素,但是const类型的容器,那么只能用cons ...
- java 集合迭代器_Java中的集合迭代器
集合的迭代器 任何集合都有迭代器. 任何集合类,都必须能以某种方式存取元素,否则这个集合容器就没有任何意义. 迭代器,也是一种模式(也叫迭代器模式).在java中它是一个对象,其目的是遍历并选中其中的 ...
- python平方数迭代器_Python三大神器之迭代器详解
我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange. 可迭代 一个对象,物理或者虚拟存储的序列.list,tuple,strins,dicttionary, ...
- python 生成器 迭代器 区别_Python生成器和迭代器的区别
What is the difference between iterators and generators? Some examples for when you would use each c ...
- c++ 迭代器++和+1_C ++中的迭代器简介
c++ 迭代器++和+1 In this article, we'll learn about Iterators in C++ in detail. While working with data ...
- java设计模式迭代器模式_Java中的迭代器设计模式
java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...
最新文章
- android 蓝牙打印格式,Android蓝牙打印格式排版
- 学习新 api 的思考过程 4.18
- python网络爬虫资源库名_Python网络爬虫
- else列表推导式 if python_python3基础09列表推导式|迭代器|生成器|匿名函数
- snmp有android代理端吗,GitHub - wosika/SNMP4Android: 简易使用于安卓的SNMP工具类,基于snmp4j...
- 分享OUTLOOK的定时发送功能
- android10设置led指示灯,Android8.0在Setting中添加Led指示灯闪烁开关
- iosmask_iOS Mask属性的详细介绍及应用实例_IOS_脚本之家
- Directx发展史
- linux 编译cgal,CGAL Bindings python Linux(Ubuntu) 安装配置 使用 CGAL-5.0.2库
- 【WEB服务器】什么是WEB服务器
- 【来龙去脉系列】机器学习入门必读
- NS前缀是什么意思?
- Markdown懒办法排版微信公众号文章
- Node Sass找不到您当前环境的绑定
- 学习WordPress必须知道的函数(转)
- c语言 %-10s,10s
- Apache Calcite 实现方言转换
- C++中的库文件导入与导出
- 计算机在小学英语中的应用,计算机游戏在小学英语教学中的应用
热门文章
- 负载均衡调度算法追溯
- Gauss Elimination算法分析与实现
- vivox20 html阅读器,【vivoX20评测】屏幕:全面屏也得看显示素质_vivo X20_手机评测-中关村在线...
- EDA实验课课程笔记(三)——TCL脚本语言的学习1
- ajax添加和删除数据,ajax 添加 更新 删除数据库
- mfc 学习的第二天
- 把一个数插入c语言,[求助] 把一个数插入一个已经从小到大排列好的数列中
- java快速排列马桶,马桶Java :6.高性能MySQL语句(二)
- 在 Arch Linux 玩百度 Flash 战曲游戏乱码
- 数据库维护管理和监视新特性