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

news2024/9/21 10:52:41

一、反向迭代器

在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.coloradmin.cn/o/1132585.html

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

相关文章

PX30 android8.1添加RTL8723DU

将8723du复制到kernel/drivers/net/wireless/rockchip_wlan/rtl8723du 并修改makefile 修改平台 CONFIG_PLATFORM_I386_PC nCONFIG_PLATFORM_ARM_RK3188 y 修改 ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y) EXTRA_CFLAGS -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDRO…

【C语言】指针那些事之数组传参和指针传参的区别

C语言系列 文章目录 目录 C语言系列 文章目录 前言 一&#xff0c;数组传参和指针传参 1.1一维数组传参 1.2二维数组传参 1.3一级指针传参 1.4当一个函数的参数部分为一级指针的时候&#xff0c;函数可以接收什么参数 1.5二级指针传参 1.6当函数的参数为二级指针的时…

服务器动态/静态/住宅/原生IP都是什么意思

​  在互联网的世界中&#xff0c;我们经常会听到关于IP地址的各种说法&#xff0c;比如服务器动态IP、静态IP、住宅IP和原生IP。那么这些术语究竟代表着什么意思呢?让我们一起来了解一下。 动态IP 动态IP(Dynamic IP)是指互联网服务提供商(ISP)在每次用户上网时&#xff0c…

智安网络|探索语音合成技术的未来:揭秘人工智能配音技术的背后

随着人工智能技术的迅猛发展&#xff0c;配音行业也迎来了人工智能配音技术的崭新时代。人工智能配音技术通过语音合成和自然语言处理等技术手段&#xff0c;实现了逼真的语音合成&#xff0c;为影视、广告和游戏等领域带来了新的可能性。 第一部分&#xff1a;语音合成技术的…

求臻医学:肺癌患者就诊指南及基因检测意义

2023年国家癌症中心公布的最新的数据显示&#xff0c;中国癌症新发病例数前十的癌症分别是&#xff1a;肺癌82万&#xff0c;结直肠癌56万&#xff0c;胃癌48万&#xff0c;乳腺癌42万&#xff0c;肝癌41万&#xff0c;食管癌32万&#xff0c;甲状腺癌22万&#xff0c;胰腺癌12…

塔式服务器介绍

大家都知道服务器分为机架式服务器、刀片式服务器、塔式服务器三类&#xff0c;今天小编就分别讲一讲这三种服务器&#xff0c;第三篇先来讲一讲塔式服务器的介绍。 塔式服务器定义&#xff1a;塔式服务器的外观和普通电脑差不多&#xff0c;直立放置。机箱比较大&#xff0c;服…

信息安全应急响应小组 诚招

介绍 小组接触领域:攻防领域CISP认证,CTF,工业自动化控制,工业网络,机械制图等 小组成立意义;致力于解决公司内外网安全,高校内外网安全,CTF赛题分析,工控领域内网安全等 小组

Stable Diffusion WebUI扩展canvas-zoom详细讲解

canvas-zoom这是什么? 这是一个针对画布做一些操作的工具,比如缩放等。 下面来详细说一下这些操作的热键。 重要的热键: 缩放(Alt+滚轮)、移动画布 (F)、全屏 (S) 和重置缩放 (R) (1)Shift + wheel - 缩放画布 按住Shift + 滚轮之后,一点反应都没有,之后按…

VR全景应用广泛体现在哪里?有何优势?

VR全景作为一种新型营销方式&#xff0c;正在逐渐走进人们的视线&#xff0c;它区别于以往单一角度的照片和视频&#xff0c;VR全景制作显得更加直观、更加真实、更加生动。VR全景通过VR技术将所拍摄的图片变成720度可观看的场景模式&#xff0c;把产品的特色以及魅力整体呈现展…

微电子/集成电路专业学术期刊汇总!

1. JSSC (IEEE Journal of Solid-State Circuits ) IEEE SSCS 旗下的旗舰期刊。IC领域公认的顶刊&#xff0c;难度最大&#xff0c;认可度最高。2020年刚升为一区。 虽然IF只有6.1&#xff0c;但其在IC圈影响力碾压众多一区高分期刊。 投这个期刊必须要有流片和测试结果&…

文件防泄密软件哪个好?

文件防泄密软件哪个好&#xff1f; 在互联网数据时代发展模式下&#xff0c;很多企业的数据都是公司的重要命脉&#xff0c;然后也会有很多人铤而走险&#xff0c;盗取公司机密信息&#xff0c;做违法的事情&#xff0c;然而&#xff0c;保护好公司数据不被泄密成了很多老板头…

Leetcode周赛365补题(3 / 3)

目录 1、2、有序三元组的最大值 - 预处理前后最大值 遍历 &#xff08;1&#xff09;预处理前后值遍历&#xff08;枚举j&#xff09; &#xff08;2&#xff09;枚举k 2、无限数组的最短子数组 - 前缀和 滑动窗口 1、2、有序三元组的最大值 - 预处理前后最大值 遍历 …

linux环境下进程相关概念解释

进程 进程概念PCB(Process control block)进程组织查看进程ps 命令getpid()/getppid()kill -9 pid/ppidfork(&#xff09;为什么fork会有两个返回值&#xff1f;为什么父进程返回子进程的PID&#xff0c;而子进程返回0&#xff1f; linux下的进程状态Z进程孤儿进程 进程优先级查…

新风机小助手-风压变速器

风压变速器是一种用于调节系统中风量和风压的装置&#xff0c;常用于通风系统中。它通过改变进出风口的开度来调整风流的速度和风压。 风压变速器通常由进出风口和可调节的风门组成。风门可以手动或自动调节&#xff0c;控制进出风口的开度&#xff0c;从而改变风量和风压。根据…

数据结构和算法概述

什么是数据结构&#xff1f; 官方解释&#xff1a; 数据结构是一门研究非数值计算的程序设计问题中的操作对象&#xff0c;以及他们之间的关系和操作等相关问题的学科。 大白话&#xff1a; 数据结构就是把数据元素按照一定的关系组织起来的集合&#xff0c;用来组织和存储…

CSC联合培养|公共管理博士赴世界名校瑞士苏黎世联邦理工学院

A同学拟申报CSC联合培养博士项目&#xff0c;要求到专业契合的世界知名高校。最终我们用世界大学排名第7的瑞士苏黎世联邦理工学院邀请函&#xff0c;助其顺利获批CSC&#xff0c;并如期出国。 A同学背景&#xff1a; 申请类型&#xff1a; CSC联合培养博士 工作背景&#xf…

mysql查询最近7天 每天销售额 统计销售额

sql统计每一天的支出数目&#xff0c;支出金额&#xff0c;收入数目&#xff0c;收入金额 finance_type0&#xff1a;收入 finance_type1&#xff1a;支出 部分建表语句&#xff1a; CREATE TABLE finance (finance_id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,finance_u…

Unity 项目中查找仅具有单一颜色的纹理

如何使用 只需在“项目”窗口中创建一个名为“编辑器”的文件夹&#xff0c;然后在其中添加此脚本即可。然后&#xff0c;打开“窗口-单色纹理检测器”并点击“刷新”。 你可能会问&#xff0c;为什么我需要这个&#xff1f;某些纹理可以是 1024x1024 或更大&#xff0c;并且…

PHPstorm 安装汉化包失败解决方法

出错的原因是官方的包和软件的版本不对应&#xff0c;下载对应的汉化包就行了 官网汉化包下载地址https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions 下载对应ide版本的包&#xff0c;我下载了一个2020版的 放到安装软件的plugins文…

纺织辅料经营小程序商城的作用是什么

数字化时代&#xff0c;各个行业都在通过线上转型实现新增长&#xff0c;纺织辅料厂商也一样&#xff0c;需要通过线上化实现与客户的面对面交流有利于打造品牌及构建私有化流量池&#xff0c;但无论入驻哪家电商平台及垂直行业平台&#xff0c;都有不少的佣金及入驻费。 可通过…