STL之list模拟实现(反向迭代器讲解以及迭代器失效)

news/2025/2/13 2:59:06/

这次是关于list的模拟实现的代码,先看看下面的代码:

#pragma once
#include <iostream>
#include "reve_iterator.hpp"
using namespace std;
namespace cc
{//链表节点template<class T>struct ListNode{T _val;ListNode *_next;ListNode *_prev;ListNode(const T& x=T()): _val(x), _next(nullptr), _prev(nullptr){}}; //迭代器template<class T,class ref,class ptr>struct list_iterator{typedef ListNode<T> Node;typedef list_iterator<T,ref,ptr> iterator;list_iterator(Node *node): _node(node){}iterator& operator++(){_node=_node->_next;return *this;}iterator operator++(int){iterator tem(_node);_node=_node->_next;return tem;}iterator& operator++()const{_node=_node->_next;return *this;}iterator operator++(int)const{iterator tem(_node);_node=_node->_next;return tem;}iterator& operator--(){_node=_node->_prev;return *this;}iterator operator--(int){iterator tem(_node);_node=_node->_prev;return tem;}bool operator!=(const iterator& d)const{return _node!=d._node;}ref operator*()const{return _node->_val;}ptr operator->()const{return &(_node->_val);}Node *_node;};//链表template<class T>class List{
public:typedef ListNode<T> Node;typedef list_iterator<T,T&,T*> iterator;typedef list_iterator<T,const T&,const T*> const_iterator;typedef reve_iterator<iterator,T&,T*> riterator;typedef reve_iterator<iterator,const T&,const T*> const_riterator;void init(){_head->_next=_head;_head->_prev=_head;}List(): _head(new Node){_head->_next=_head;_head->_prev=_head;}template<typename Iterator>List(Iterator begin,Iterator end): _head(new Node){init();while(begin!=end){push_back(*begin);begin++;}}List(const List<T>& d): _head(nullptr){List<T> tem(d.begin(),d.end());swap(tem);}List<T>& operator=(List<T> d){swap(d);return *this;}iterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}riterator rbegin(){return riterator(_head);}riterator rend(){return riterator(_head->_next);}const_iterator begin()const{return const_iterator(_head->_next);}const_iterator end()const{return const_iterator(_head);}void swap(List<T>& d){std::swap(_head,d._head);}void push_back(const T& x=T()){Node *cur=new Node(x);Node *tail=_head->_prev;tail->_next=cur;cur->_prev=tail;cur->_next=_head;_head->_prev=cur;}
private:Node *_head;};
}

上面是list的代码,其底层是一个带头双向循环的链表,实现的方法就不说了,相信大家已经都会了,然后自己实心的list我没有写析构函数等,这个也很简单,循环利用成员函数中的删除函数就可以。

先来说说个人认为比较重要的东西:

首先是迭代器失效:list迭代器的失效与vector不同,list的迭代器在插入时不会有迭代器失效的现象,只有在删除的时候才有迭代器失效的现象,插入没有失效现象的原因,很简单,就不多说,而删除导致迭代器失效的原因是,在删除一个节点的时候,我们把这个节点所占的空间已经给释放了,所以此时指向这个节点的指针已经是野指针了,所以导致迭代器失效。

其次就是反向迭代器的实现了,我们先看看下面的反向迭代器的代码:

#pragma once
#include "list.hpp"
namespace cc
{template<class Iterator,class ref,class ptr>struct reve_iterator{public:typedef reve_iterator<Iterator,ref,ptr> riterator;reve_iterator(Iterator it): It(it){}bool operator!=(const riterator& d)const{return It!=d.It;}riterator& operator++(){It--;return *this; }riterator operator++(int){Iterator tem(It);It--;return riterator(tem);}riterator& operator++()const{It--;return *this; }riterator operator++(int)const{Iterator tem(It);It--;return riterator(tem);}ref operator*()const{Iterator tem(It);return *(--tem);}ptr operator->()const{return &(*It);}private:Iterator It;};
}

以上就是反向迭代器实现的代码,在list中的迭代器,不像我们之前的迭代器是原生指针,list的迭代是我们的自己定义的类似于一个指针的类,个人理解其实就是指针,只不过这个指针被包装了,我们以前用的指针没有被包装而已。那就来说说实现方法吧。首先就是这个指针类的成员函数了,运算符的重载一定要有,具体的看上面代码。主要讲解的是,因为反向迭代器的实现底层是在正向迭代器的基础上实现的,所以反向迭代中的++对于正向迭代器来说,就是--,一定要区分开这个。再就是“->”的重载其实是为了以防万一,防止val的值是一种类,这样的话就可以访问这个类的值了。

以上就是本篇的内容,如果对你们有帮助的话,希望点一下赞!谢谢支持!


http://www.ppmy.cn/news/1061394.html

相关文章

VS插件DevExpress CodeRush v23.1 - 支持Visual Studio ARM

DevExpress CodeRush是一个强大的Visual Studio .NET 插件&#xff0c;它利用整合技术&#xff0c;通过促进开发者和团队效率来提升开发者体验。CodeRush能帮助你以极高的效率创建和维护源代码。Consume-first 申明&#xff0c;强大的模板&#xff0c;智能的选择工具&#xff0…

可视化绘图技巧100篇基础篇(七)-散点图(一)

目录 前言 适用场景 图例 普通散点图与可视化 曲线图 气泡图

云计算企业私有云平台建设方案PPT

导读&#xff1a;原文《云计算企业私有云平台建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 喜欢文章&#xff0c;您可以点赞评论转发本文&#xff0c;…

4.1011

目录 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 在 TIME_WAIT 状态的 TCP 连接&#xff0c;收到 SYN 后会发生什么&#xff1f; 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 如果FIN报文比数据包先道道客户端&#xff0c;此时FIN是一个乱序报文&#xff0c;此时…

适配小程序隐私保护指引设置

由于小程序发布了一个公告&#xff0c;那么接下来就是怎么改简单的问题了。毕竟不太想大的改动历史上的代码。尽量简单的适配隐私策略就可以了。 整体思路也是参考现在App普遍的启动就让用户同意隐私策略&#xff0c;不同意不让用&#xff0c;同意了之后才能够继续使用。 公告…

22-扩展

一 进程与线程;同步与异步任务;宏任务与微任务 一、进程与线程 一个程序只有一个进程,一个进程包含多个线程,单线程和多线程 二、同步与异步任务 同步任务:是指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务。按顺序执行,可以看做单线程,…

[uniapp] scroll-view 简单实现 u-tabbar效果

文章目录 方案踩坑1.scroll-view 横向失败2.点击item不滚动?3. scrollLeft从哪里来? 效果图 方案 官方scroll-view 进行封装 配合属性 scroll-left Number/String 设置横向滚动条位置 即可 scroll-into-view 属性尝试过,方案较难实现 踩坑 1.scroll-view 横向失败 安装…

计算机竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…