当前位置: 首页 > news >正文

迭代器的封装与反向迭代器

一、反向迭代器

在list模拟实现的过程中,第一次接触了迭代器的封装,将list的指针封装成了一个新的类型,并且以迭代器的基本功能对其进行了运算符重载

反向迭代器是对正向迭代器的封装,并且体现了泛型编程的思想,任意类型的双向迭代器都可以直接复用反向迭代器

本章将把两个迭代器的实现放在一起比对,更好的体会迭代器的封装

二、list正向迭代器的模拟实现

详解可以看list模拟实现那一章节,这里仅提供一份代码用于对照反向迭代器

	template<class T,class Ref,class Ptr>struct __list_iterator{typedef list_node<T> node;typedef __list_iterator<T, Ref, Ptr> self;node* _pnode;__list_iterator(node* p):_pnode(p){}self& operator++(){_pnode = _pnode->_next;return *this;}self& operator--(){_pnode = _pnode->_prev;return *this;}self operator++(int){self tmp(_pnode);_pnode = _pnode->_next;return tmp;}self operator--(int){self tmp(_pnode);_pnode = _pnode->_prev;return tmp;}Ref operator*(){return _pnode->_data;}Ptr operator->(){return &(_pnode->_data);}bool operator!=(const self& p){return _pnode != p._pnode;}bool operator==(const self& p){return _pnode == p._pnode;}};

三、反向迭代器的封装实现(双向迭代器)

反向迭代器的实现是对正向迭代器的封装

1.成员及其初始化

template<class Iterator,class Ref,class Ptr>
struct ReserveIterator
{typedef ReserveIterator self;//重命名方便使用Iterator _it;//成员变量ReserveIterator(Iterator it):_it(it){}
}

2.基本功能的重载

(1) ++ 和 --

在反向迭代器的概念中,反向迭代器++,就是正向迭代器--

self& operator++()
{_it--;return *this;
}
self& operator--()
{_it++;return *this;
}
//前置++和--
self operator++(int)
{self tmp(*this);_it--;return tmp;
}
self operator--(int)
{self tmp(*this);_it++;return tmp;
}

(2) != 和 ==

bool operator!=(const self& s)
{return _it != s._it;
}
bool operator==(const self& s)
{return _it == s._it;
}

(3) -> 和 *

在实现operator*()之前,要先理解底层,在stl库内的实现,为了让begin()和rend(),所在的物理空间上对称,但在使用的角度上来看,并不对称,为了使其对称,且不影响使用,对*和->的实现作出了调整,解引用返回的是其前一个的位置

Ref operator*()
{Iterator tmp(_it);_it--;return *tmp; 
}
Ptr operator->()
{Iterator tmp(_it);_it--;return &(*_it);
}

3.定义部分

		typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> con_iterator;typedef ReverseIterator<iterator, T&, T*> reverse_iterator;typedef ReverseIterator<iterator,const T&,const T*> con_reverse_iterator;iterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}con_iterator begin()const{return con_iterator(_head->_next);}con_iterator end()const{return con_iterator(_head);}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}

总结

本章整理了关于反向迭代器的相关内容,以及模拟实现

http://www.lryc.cn/news/205702.html

相关文章:

  • PHP项目学习笔记-萤火商城https://www.yiovo.com/doc
  • 我国有多少个港口?
  • uniapp实现登录组件之外区域置灰并引导登录
  • 抄表系统是如何抄到电表水表的数据的?
  • Qt之自定义事件QEvent
  • 项目管理week5——交个作业
  • 5.5G移动通信技术
  • chrony时间服务
  • 音乐制作软件 Studio One 6 mac中文版软件特点
  • SpringBoot整合redis集群和redis单节点
  • 【ARM Coresight 系列文章19.1 -- Cortex-A720 PMU 详细介绍】
  • FoneDog iOS Unlocker(ios解锁工具) 适用macos电脑
  • 雅可比矩阵和雅可比坐标
  • macOS鼠标管理操作增强BetterMouse简体中文
  • 塔式服务器介绍
  • 上海市道路数据,有63550条数据(shp格式和xlsx格式)
  • 计算机网络_03_tcp/ip四层模型
  • [SQL开发笔记]IN操作符: 在WHERE子句中规定多个值
  • Java基础(第一期):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现
  • 0基础学习PyFlink——使用PyFlink的SQL进行字数统计
  • 【Java系列】ArrayList
  • sqlalchemy 使用
  • Python深度学习实战-基于class类搭建BP神经网络实现分类任务(附源码和实现效果)
  • GIS 数据结构整理:网格索引
  • 【打靶】vulhub打靶系列(一)—小白视野的渗透测试
  • kafka3.X集群安装(不使用zookeeper)
  • 2023 年 的 DBA 有哪些变化?
  • vs2022 使用git同步报错以及解决每次推送要输入密码问题
  • 有哪些适用于 Windows 的PDF 阅读器?免费 PDF 阅读器清单
  • 避雷!新增2本期刊被标记为「On Hold」,1区TOP刊仍在调查中!