迭代器的封装与反向迭代器
一、反向迭代器
在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());}
总结
本章整理了关于反向迭代器的相关内容,以及模拟实现
相关文章:
迭代器的封装与反向迭代器
一、反向迭代器 在list模拟实现的过程中,第一次接触了迭代器的封装,将list的指针封装成了一个新的类型,并且以迭代器的基本功能对其进行了运算符重载 反向迭代器是对正向迭代器的封装,并且体现了泛型编程的思想,任意…...
PHP项目学习笔记-萤火商城https://www.yiovo.com/doc
萤火商城学习笔记 注意事项关于建表增加页面流程前台页面的数据列表数据下拉列表的数据 关于时间的处理前台界面数据处理 多年没有碰过php代码了,这个项目不错,想好好学习下,持续更新 注意事项 打开APP_DEBUG有些时候改了前台页面后&#x…...
我国有多少个港口?
港口是什么? 港口是海洋运输中不可或缺的重要设施之一,是连接陆路和水路运输的重要节点。港口通常是指位于沿海地区的水陆交通枢纽,是船舶停靠、装卸货物、储存物资和维修船只的场所。港口一般由码头、泊位、仓库、货场、客运站等设施组成&a…...
uniapp实现登录组件之外区域置灰并引导登录
实现需求 每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下: 实现思路说明 设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分), 置灰区域添加…...
抄表系统是如何抄到电表水表的数据的?
抄表系统是一种利用无线通信技术,实现远程读取电表水表数据的系统。抄表系统主要由三部分组成:电表水表、集中器和后台管理平台。接下来,小编来为大家详细的介绍下抄表系统是如何抄到电表水表的数据的,一起来看下吧! 电表水表是抄…...
Qt之自定义事件QEvent
在Qt中,自定义事件的步骤大概如下: 1.创建自定义事件,自定义事件需要继承QEvent 2.使用QEvent::registerEventType()注册自定义事件类型,事件的类型需要在 QEvent::User 和 QEvent::MaxUser 范围之间,在QEvent::User之前是预留给系统的事件 3.使用sendEvent() 和 postEv…...
项目管理week5——交个作业
...
5.5G移动通信技术
5.5G即5G-Advanced,是一种移动通信技术。 5.5G 是 5G 和 6G 之间的过渡阶段,将在速率、时延、连接规模和能耗方面全面超越现有 5G,有望实现下行万兆和上行千兆的峰值速率、毫秒级时延和低成本千亿物联。按照国际标准组织 3GPP 定义ÿ…...
chrony时间服务
目录 1.1.重要性 1.2. Linux的两个时钟 1.3. NTP 1.4. Chrony介绍 2.安装与配置 2.1.安装: 2.2. Chrony配置文件分析 3.实验 3.1实验1 3.2实验2 3.常见时区 1.1.重要性 ●由于IT系统中,准确的计时非常重要,有很多种原因需要准确计时: 。在网络…...
音乐制作软件 Studio One 6 mac中文版软件特点
Studio One mac是一款专业的音乐制作软件,该软件提供了全面的音频编辑和混音功能,包括录制、编曲、合成、采样等多种工具,可用于制作各种类型的音乐,如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件特点 1. 直观易用的界面&…...
SpringBoot整合redis集群和redis单节点
// 连接redis单节点配置类Configuration public class RedisConfig {Value("${spring.redis.host}")private String host;Value("${spring.redis.port}")private Integer port;Value("${spring.redis.password}")private String password;/*** d…...
【ARM Coresight 系列文章19.1 -- Cortex-A720 PMU 详细介绍】
文章目录 概述Cortex-A720 PMU Features1.1 PMU 使用介绍1.2 Performance monitors events1.3 Performance Monitors Extension registers1.3.1 Performance monitors program1.4 Performance monitors interrupts1.5 Interaction with the Performance Monitoring Unit and De…...
FoneDog iOS Unlocker(ios解锁工具) 适用macos电脑
FoneDog iOS Unlocker是一款专业的iOS设备解锁工具,旨在帮助用户解决iOS设备上的解锁问题。该软件支持解锁各种锁定类型,如数字密码锁、手势密码锁、Touch ID和Face ID等,可以解除iPhone、iPad和iPod Touch等设备的锁定状态。FoneDog iOS Unl…...
雅可比矩阵和雅可比坐标
雅可比行列式的简要介绍 一、说明 在本教程中,您将回顾一下雅可比行列式的简单介绍。完成本教程后,您将了解: 雅可比矩阵收集了可用于反向传播的多元函数的所有一阶偏导数。雅可比行列式在变量之间变化时非常有用,它充当一个坐标空…...
macOS鼠标管理操作增强BetterMouse简体中文
BetterMouse是一款专为Mac用户设计的鼠标增强工具,旨在帮助用户更好地掌握和管理鼠标操作。它提供了全局鼠标手势、高度可定制的鼠标设置选项以及一些有用的鼠标增强功能,如鼠标放大镜、鼠标轨迹和应用程序切换功能。这些功能可以大大提高用户的工作效率…...
塔式服务器介绍
大家都知道服务器分为机架式服务器、刀片式服务器、塔式服务器三类,今天小编就分别讲一讲这三种服务器,第三篇先来讲一讲塔式服务器的介绍。 塔式服务器定义:塔式服务器的外观和普通电脑差不多,直立放置。机箱比较大,服…...
上海市道路数据,有63550条数据(shp格式和xlsx格式)
数据地址: 上海市道路https://www.xcitybox.com/datamarketview/#/Productpage?id391 基本信息. 数据名称: 上海市道路数据 数据格式: Shpxlsx 数据时间: 2020年 数据几何类型: 线 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段&am…...
计算机网络_03_tcp/ip四层模型
文章目录 1.为什么会有tcp/ip?2.tcp/ip是什么?3.为什么会有tcp/ip四层模型?4.tcp/ip四层模型介绍 1.为什么会有tcp/ip? 早期的计算机(计算机网络没有出现之前)几乎都是各自为战, 各种操作系统厂家百花齐放, 市面上的大部分计算机使用的都是不同的操作系统, 为每个人提供定…...
[SQL开发笔记]IN操作符: 在WHERE子句中规定多个值
上一实例我们在where子句使用(year2022 or year2020),如果我们需要在WHERE子句中规定多个值呢?这时我们将学习IN操作符 一、功能描述: 在WHERE子句中规定多个值。 二、IN操作符语法详解: IN操作符语法: SELECT col…...
Java基础(第一期):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现
Java基础专栏: Java基础第一期下一期:Java基础第二期 文章目录 IDEA1.1 IDEA概述1.2 IDEA的下载和安装1.2.1 下载1.2.2 安装 1.3 IDEA中层级结构介绍1.3.1 结构分类1.3.2 结构介绍project(项目、工程)module(模块&…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
