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

C++中链表的底层迭代器实现

大家都知道在C++的学习中迭代器是必不可少的,今天我们学习的是C++中的链表的底层迭代器的实现,首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别,为什么顺序表的底层迭代器更加容易实现,而链表的底层迭代器不容易实现,接下来小编再来告诉大家如何来实现链表的底层迭代器,学完今天这篇我相信大家对C++中的迭代器一定会有一个更加深刻的认识!大家先看今天学习的内容:

一、顺序表和链表的底层迭代器的区别

为了知道它们两个的区别,先得告诉大家顺序表的底层迭代器是如何实现的,首先大家先得明白顺序表私有成员都有什么,好方便大家来理解它们的底层迭代器是如何实现的,请看下图顺序表的私有成员变量:

	private:iterator _start;iterator _finish;iterator _end_of_storage;

如图就是顺序表的私有成员变量 第一个 _start 是记录顺序表的起始位置的指针类型是 T*

_finish记录的是顺序表内末尾元素的下一个位置的指针类型是T*,_end_of_storage记录的是顺序表的目前的所有容量的下一个位置类型也是T*。

在明白了顺序表的私有成员变量的意义,并且顺序表的储存是连续的空间有点类似于数组的数据储存,所以大家也应该明白了顺序表的底层迭代器是如何实现的了吧,如果不懂请看下图操作及注释,如下图:

但是由于链表的物理结构不是连续的,所以想顺序表一样的底层迭代器实现方法是行不通的,这也是为什么在底层实现链表的迭代器中,不能通过给迭代器++来做到迭代器指向下一个元素的地址,因为链表的数据在空间中分布式随意的。那该如何去设计链表的底层迭代器呢,请大家继续往下看。

二、链表的底层迭代器该如何实现

首先先请大家看一下链表中的数据是如何分布的,如下图:

如图,可见链表中的数据是随意分布的,但是我们仍然可以用前一个节点找到下一个节点,但为什么这样子不行,不算迭代器呢,因为在C++中迭代器的定义就是通过 ++ 来找到下一个元素,接通过 * 号来拿到他这个位置的数据,这才是迭代器的规定,如下段代码的遍历效果:

如上链表的分布图,虽然我们可以拿到下一个节点的位置和这个节点的数据,但我们不是通过 ++ 和 * 来实现的,所以通过这样的方式做出的迭代器是不对的。那我们该如何实现呢,小编新学了一个方法,就是把迭代器底层封装成一个类,让它内部进项运算符重载来达到 ++ 实现像迭代器一样遍历的过程* 实现像迭代器一样拿出数据的过程,那么该如何实现呢,请大家继续往下看。

三、链表底层迭代器的实现

上面说到把迭代器封装成一个类,然后用运算符重载来达到 ++* 的过程,把它彻底改变为一个正规的迭代器,现在大家就和我一起实现这个迭代器的类:

1、首先大家要明白链表(带头双向循环链表)的结构,如下代码:

template<class T>
// 这里用结构体是因为ListNode中的每个成员都应该可以访问 没有私有成员
// 也可以使用友元来解决这个问题
struct ListNode
{T _data;ListNode* _next;ListNode* _prev;ListNode(const T& data = T()):_next(nullptr),_prev(nullptr), _data(data){}
};
	template<class T>class list{public:typedef ListNode<T> Node;private:Node* _head;};

如上图代码,在这里我们已经知道下一步需要把链表独特的遍历方式(用前一个指针找到后一个指针)用运算符重载的改为 ++  来实现遍历和拿到数据,保证它和迭代器的实现和用法一模一样。那该如何实现这个类呢。

2、实现迭代器的类

我们需要定义一个迭代器的类,因为有普通迭代器和不可修改的迭代器,它们两个的函数大多数相同,为了减少代码量,我们加入两个模板参数来帮我们减轻代码量

	// 这里加入 Ref 和 Ptr 是为了区分普通迭代器和const迭代器的区别// 本来要写两份迭代器,一份可修改,一份不可修改 现在直接交给编译器去做template<class T , class Ref, class Ptr>struct ListIterator{typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;// 链表的迭代器应该是 Node* 类型的指针Node* _node;ListIterator(Node* node):_node(node){}// 前置++Self& operator++(){_node = _node->_next;return *this;}//前置--Self& operator--(){_node = _node->_prev;return *this;}Self operator++(int){Self tem(*this);_node = _node->_next;return tem;}Self operator--(int){Self tem(*this);_node = _node->_prev;return tem;}Ptr operator->(){return &(_node->_data);}Ref operator*(){return _node->_data;}bool operator!=(const Self& it){return _node != it._node;}bool operator==(const Self& it){return _node == it._node;}};

以上就是今天的所有内容,希望大家会喜欢!!!

相关文章:

C++中链表的底层迭代器实现

大家都知道在C的学习中迭代器是必不可少的&#xff0c;今天我们学习的是C中的链表的底层迭代器的实现&#xff0c;首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别&#xff0c;为什么顺序表的底层迭代器更加容易实现&#xff0c;而链表的底层迭代器…...

3.5、matlab打开显示保存点云文件(.ply/.pcd)以及经典点云模型数据

1、点云数据简介 点云数据是三维空间中由大量二维点坐标组成的数据集合。每个点代表空间中的一个坐标点&#xff0c;可以包含有关该点的颜色、法向量、强度值等额外信息。点云数据可以通过激光扫描、结构光扫描、摄像机捕捉等方式获取&#xff0c;广泛应用于计算机视觉、机器人…...

Qt-事件与信号

事件和信号的区别在于&#xff0c;事件通常是由窗口系统或应用程序产生的&#xff0c;信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装&#xff0c;如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…...

数据结构 day3

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 顺序表 1.1 概念 1.2 有关顺序表的操作 1.2.1 创建顺序表 1.2.2 顺序表判空和判断满 1.2.3 向顺序表中添加元素 1.2.4 遍历顺序表 1.2.5 顺序表按位置进行插入元素 1.2.6 顺序表任意位置删除元素 1.2.7 按值进…...

Kubernetes面试整理-如何进行滚动更新和回滚?

在 Kubernetes 中,滚动更新和回滚是管理应用程序版本的常用操作。滚动更新允许您逐步替换现有的 Pod 实例,以便在不中断服务的情况下部署新版本。回滚则是在新版本出现问题时恢复到之前的版本。 滚动更新 通过 Deployment 进行滚动更新 1. 创建一个 Deployment: 下面是一个…...

flutter ios打包 xcode报错module ‘xxx‘ not found

flutter ios打包 xcode报错module ‘xxx’ not found 如果已经在androidstudio中成功运行了flutter build ios --release。 那么可能是你使用xcode打开的是ios/Runner.xcodeproj文件。 你关掉xcode&#xff0c;重新打开ios/Runner.xcworkspace/文件。然后重新archive&#xff…...

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)

概述 在先前探讨的文章中&#xff0c;我们构建了一个全面的数据测试体系&#xff0c;该体系遵循“数据获取—数据治理—数据分析”的流程。如何高效地构建数据可视化看板&#xff0c;以直观展现分析结果&#xff0c;正逐渐成为利用新兴技术提升效能的关键领域。伴随业务拓展、数…...

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…...

【Pytorch笔记】张量

torch.Tensor() 是 PyTorch 库中用于创建张量的一个函数。在 PyTorch 中&#xff0c;张量是多维数组&#xff0c;它们可以存储在 CPU 或 GPU 上&#xff0c;并且支持自动求导&#xff0c;这使得它们非常适合进行深度学习和科学计算。 张量可以在Python list形式下通过 torch.T…...

查找json中指定节点的值,替换为指定的值

有时我们封装好的实体转化成的json字段的值和第三方要求的不一样&#xff0c;比如我们字段的值是字符串&#xff0c;我们需要使用int类型的值&#xff0c;就需要将这个键的值转化成int类型。 比如将以下 convulsionNumber字段中字符串的值“一次”替换为0 {"convulsionT…...

Android 14 开机时间优化措施

Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…...

【QGroundControl二次开发】二.使用QT编译QGC(Windows)

【QGroundControl二次开发】一.开发环境准备&#xff08;Windows&#xff09; 二. 使用QT编译QGC&#xff08;Windows&#xff09; 2.1 打开QT Creator&#xff0c;选择打开项目&#xff0c;打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…...

[C/C++入门][变量和运算]4、带余除法

给定被除数和除数&#xff0c;求整数商及余数 看到这个题&#xff0c;我们都知道C的除法运算符 /,默认是不带余数的。那现在要求带余数&#xff0c;需要能够想到% %&#xff0c;是C获取余数的方法&#xff1a;比如5/22&#xff1b; 5%21&#xff1b;%得到的是除后的余数。 #inc…...

常用优秀内网穿透工具(实测详细版)

文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…...

防火墙NAT地址转换和智能选举综合实验

一、实验拓扑 目录 一、实验拓扑 二、实验要求&#xff08;接上一个实验要求后&#xff09; 三、实验步骤 3.1办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 3.2分公司设备可以通过总公司的移动链路和电信链路访…...

Android获取当前屏幕显示的是哪个activity

在 Android 中&#xff0c;要获取当前屏幕显示的 Activity&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法&#xff0c;尽管从 Android 5.0 (API 21) 开始&#xff0c;有些方法变得不太可靠…...

JVM:自动垃圾回收

文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收&#xff08;1&#xff09;引用计数法和可达性分析法&#xff08;2&#xff09;五种对象引用&#xff08;3&#xff09;垃圾回收算法 一、C/C的内存管理 在C和C没有自动垃圾回收机制&#xff0c;一个对象…...

【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误

1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后&#xff0c;残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3&#xff0c;发现以前的套路已经失效了。反复重装PHP8.3失败后&#xf…...

鸿蒙语言基础类库:【@system.notification (通知消息)】

通知消息 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.notification]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import notification fro…...

1.JavaWeb开发简介(Tomcat安装使用+Servlet简介)

文章目录 一.web开发简介1.概念:2.特点:3.常用技术:4.服务架构5.web应用开发模式6.HTTP协议1)概念:2)HTTP最基本的过程是:3)IP/域名4)HTTP协议请求方式 7.JavaWeb的相关技术8.Java Web服务器 二、安装配置Tomcat1.简介2.Tomcat目录结构 三.Servlet的入门应用1.使用步骤2.使用注…...

Unity卡牌UI框架实战:构建高性能游戏界面的深度策略

Unity卡牌UI框架实战&#xff1a;构建高性能游戏界面的深度策略 【免费下载链接】UiCard Generic UI for card games like Hearthstone, Magic Arena and Slay the Spire... 项目地址: https://gitcode.com/gh_mirrors/ui/UiCard 在卡牌游戏开发领域&#xff0c;UI交互的…...

STM32智能甲鱼养殖系统设计与实现

基于STM32的智能甲鱼养殖系统设计与实现1. 项目概述1.1 系统背景现代水产养殖行业正面临从传统人工管理向智能化转型的关键时期。甲鱼作为对水质环境敏感的特种水产品&#xff0c;其养殖过程中需要持续监测多项水质参数并保持稳定环境。传统人工监测方式存在响应滞后、精度不足…...

RTC成语音AI基础设施:AWS和ElevenLabs相继跟进,ZEGO已跑三年

2026 年 3 月&#xff0c;语音 AI 领域迎来一个值得关注的技术信号&#xff1a;AWS&#xff08;亚马逊云科技&#xff09;与 ElevenLabs 在同一个月内相继宣布支持 WebRTC 协议。这一时间上的高度吻合&#xff0c;折射出行业对实时语音交互底层架构的共同判断&#xff1a;传统 …...

Play Integrity Fix:高效解决Android设备认证问题的实战指南

Play Integrity Fix&#xff1a;高效解决Android设备认证问题的实战指南 【免费下载链接】PlayIntegrityFix Fix Play Integrity (and SafetyNet) verdicts. 项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix 问题引入&#xff1a;Android设备认证的…...

用STM32+物联网做个智能药盒:手把手教你搞定毕设硬件选型与代码框架

基于STM32的智能药盒开发实战&#xff1a;从硬件选型到云端联调 在老龄化社会加速和慢性病管理需求激增的背景下&#xff0c;智能医疗设备正从医院走向家庭。作为嵌入式开发者&#xff0c;将STM32与物联网技术结合打造智能药盒&#xff0c;不仅能解决实际用药管理痛点&#xff…...

如何高效使用AsrTools:快速上手指南与实用功能详解

如何高效使用AsrTools&#xff1a;快速上手指南与实用功能详解 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate tex…...

大数据运维 | 项目一:大数据分布式集群搭建全攻略

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 前言 作为一名大数据运维工程师&#xff0c;你是否遇到过这样的问题&#xff1a; 问题场景描述1机器A可正常上网&#xff0c;但机器B无法连接网…...

手把手教你用ESP8266 AT指令连接华为云IoT(附固件烧录与MQTT避坑指南)

从零玩转ESP8266&#xff1a;华为云IoT连接实战与深度排错指南 当你第一次拿到那块拇指大小的ESP8266模块时&#xff0c;可能不会想到这个售价不到20元的Wi-Fi芯片能成为物联网世界的通行证。作为全球使用量最大的IoT连接方案之一&#xff0c;ESP8266配合华为云物联网平台&…...

3秒获取全网歌词:163MusicLyrics让多平台歌词提取效率提升10倍

3秒获取全网歌词&#xff1a;163MusicLyrics让多平台歌词提取效率提升10倍 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在数字音乐时代&#xff0c;歌词已成为音乐体验…...

别再手动拖拽了!用Mermaid语法+draw.io,5分钟搞定系统设计流程图

从文本到图表&#xff1a;Mermaid与draw.io的高效设计工作流革命 每次系统设计会议后&#xff0c;你是否也经历过这样的场景&#xff1a;白板上密密麻麻的逻辑草图需要转化为电子版&#xff0c;而传统拖拽式绘图工具让你在调整箭头和对齐方框上耗费半小时&#xff1f;作为经历…...