List迭代器和模拟(迭代器的模拟)

发布时间:2026/10/28 9:28:52

List迭代器和模拟(迭代器的模拟) 目录单向、双向、随机迭代器list的模拟结点迭代器插入删除emptysize获取头部元素获取尾部元素尾插尾删头插头删clearswap拷贝赋值完整代码单向、双向、随机迭代器算法对迭代器是有要求的算法迭代器名字就是要求。迭代器通用的功能/*解引用/这几个基本组成。需要单向迭代器的算法则在这个算法加入的迭代器就必须是大于单向迭代器的功能的也就是说后面的迭代器都支持前面迭代器的功能这里体现了向前兼容特点也更好的解偶如果是数据结构stl迭代器是双向迭代器是实现不了随机的功能的这也导致了有时候使用迭代器时候用不了 -迭代这就是因为双向迭代器不支持-这些运算符重载。双向迭代器不能支持-操作一般能实现的只有随机迭代器解决办法就是在调用之前使用一个变量存储迭代器然后\--操作达到想要的指向地址list内部的sort算法如果数据量小就用数据量大用别人的。因为算法库里面的sort是随机迭代器比list大所以有些操作不能支持所以这里需要写sort调用list自己的sort。list的模拟结点双向链表的结点和我们在数据结构中双向链表是一样的。//链表结点 templateclass T class list_node { T data; //数据内容 list_node* next;//指向下一个结点 list_node* prev;//指向上一个结点 //构造 list_node(const T value) :data(value) ,next(nullptr) ,prev(nullptr) {} };迭代器//迭代器 templateclass T,class Ref,class Ptr struct __list_iterator { typedef list_nodeT Node; typedef __list_iteratorT, Ref, Ptr Self; Node* _pNode; //构造 __list_iterator(Node* pNode nullptr) :_pNode(pNode) {} //*解引用访问数据 Ref operator*()//使用引用是为了方便修改数据 { return _pNode-_data; } //-运算符重载 Ptr operator-() { return (_pNode-_data); } //运算符重载 Self operator() { _pNode _pNode-_next; return *this; } //后置 Self operator(int) { Self tmp(*this); _pNode _pNode-_next; return tmp; } //--运算符重载 Self operator--() { _pNode _pNode-_prev; return *this; } //后置-- Self operator--(int) { Self tmp(*this);//拷贝值浅拷贝 _pNode _pNode-_prev; return tmp; } //!运算符重载 bool operator!(const Self l)const { return _pNode l._pNode; } //运算符重载 bool operator (const Self l)const { return _pNode l._pNode; } };插入iterator insert(iterator pos, const T value) { Node* newnode new Node(value); Node* cur pos._pNode; Node* prev pos._pNode-_prev; //newnode newnode-_next cur; newnode-_prev prev; //prev cur prev-_next newnode; cur-_prev newnode; _size; return newnode; }删除//删除 iterator erase(iterator pos) { Node* next pos._pNode-_next; Node* prev pos._pNode-_prev; prev-_next next; next-_prev prev; delete pos._pNode; pos._pNode nullptr; --_size; return next; }empty//empty bool empty() { return _size 0; }size//size size_t size() { return _size; }获取头部元素//获取首元素 T front()const { return _head-_next-_data; }获取尾部元素//获取尾部元素 T back()const { return _head-_prev-_data; }尾插尾删//尾插 void push_back(const T value) { insert(end(), value);//这里不用前置--insert在设计的时候就是在pos位置之前插入 } //尾删 void pop_back() { erase(--end()); }这里为了避免大家翻上面代码我这里把insert和erase的代码放在下面insert//插入 iterator insert(iterator pos, const T value) { Node* newnode new Node(value); Node* cur pos._pNode; Node* prev pos._pNode-_prev; //newnode newnode-_next cur; newnode-_prev prev; //prev cur prev-_next newnode; cur-_prev newnode; _size; return newnode; }erase//删除 iterator erase(iterator pos) { Node* next pos._pNode-_next; Node* prev pos._pNode-_prev; prev-_next next; next-_prev prev; delete pos._pNode; pos._pNode nullptr; --_size; return next; }头插头删//头插 void push_front(const T value) { insert(begin(), value); } //头删 void pop_front() { erase(begin()); }clear//clear void clear() { iterator it begin(); while (it ! end()) { it erase(it); } }swap//swap void swap(listT l) { std::swap(_head, l._head); std::swap(_size, l._size); }拷贝//拷贝 list(const listT l) { _head new Node; _head-_next _head; _head-_prev _head; for (auto e : l) { push_back(e); } }赋值//赋值 listT operator(const listT l) { //_head l._head; //_size l._size; //return *this; if(this ! l) { clear(); listT tmp(l); swap(tmp); } return *this; }完整代码#pragma once #includeiostream using namespace std; namespace bear { //链表结点 templateclass T struct list_node { T _data; //数据内容 list_nodeT* _next;//指向下一个结点 list_nodeT* _prev;//指向上一个结点 //构造 list_node(const T value T()) :_data(value) ,_next(nullptr) ,_prev(nullptr) {} }; //迭代器 templateclass T,class Ref,class Ptr struct __list_iterator { typedef list_nodeT Node; typedef __list_iteratorT, Ref, Ptr Self; Node* _pNode; //构造 __list_iterator(Node* pNode) :_pNode(pNode) {} //*解引用访问数据 Ref operator*()//使用引用是为了方便修改数据 { return _pNode-_data; } //-运算符重载 Ptr operator-() { return (_pNode-_data); } //运算符重载 Self operator() { _pNode _pNode-_next; return *this; } //后置 Self operator(int) { Self tmp(*this); _pNode _pNode-_next; return tmp; } //--运算符重载 Self operator--() { _pNode _pNode-_prev; return *this; } //后置-- Self operator--(int) { Self tmp(*this);//拷贝值浅拷贝 _pNode _pNode-_prev; return tmp; } //!运算符重载 bool operator!(const Self l)const { return _pNode ! l._pNode; } //运算符重载 bool operator (const Self l)const { return _pNode l._pNode; } }; templateclass T class list { public: typedef list_nodeT Node; typedef __list_iteratorT, T, T* iterator; typedef __list_iteratorT, const T, const T* const_iterator; //迭代器 iterator begin() { return iterator(_head-_next); } iterator end() { return iterator(_head); } const_iterator begin()const { return const_iterator(_head-_next); } const_iterator end()const { return const_iterator(_head); } //构造 list() { _head new Node; _head-_next _head; _head-_prev _head; } //拷贝 list(const listT l) { _head new Node; _head-_next _head; _head-_prev _head; for (auto e : l) { push_back(e); } } //赋值 listT operator(const listT l) { //_head l._head; //_size l._size; //return *this; if(this ! l) { clear(); listT tmp(l); swap(tmp); } return *this; } //析构 ~list() { clear(); delete _head; _head nullptr; } //插入 iterator insert(iterator pos, const T value) { Node* newnode new Node(value); Node* cur pos._pNode; Node* prev pos._pNode-_prev; //newnode newnode-_next cur; newnode-_prev prev; //prev cur prev-_next newnode; cur-_prev newnode; _size; return newnode; } //删除 iterator erase(iterator pos) { Node* next pos._pNode-_next; Node* prev pos._pNode-_prev; prev-_next next; next-_prev prev; delete pos._pNode; pos._pNode nullptr; --_size; return next; } //empty bool empty()const { return _size 0; } //size size_t size()const { return _size; } //获取首元素 T front()const { return _head-_next-_data; } //获取尾部元素 T back()const { return _head-_prev-_data; } //尾插 void push_back(const T value) { insert(end(), value); } //尾删 void pop_back() { erase(--end()); } //头插 void push_front(const T value) { insert(begin(), value); } //头删 void pop_front() { erase(begin()); } //clear void clear() { iterator it begin(); while (it ! end()) { it erase(it); } } //swap void swap(listT l) { std::swap(_head, l._head); std::swap(_size, l._size); } private: Node* _head; size_t _size 0; }; }
延伸阅读

更多相关文章

2026/10/28 9:23:49

虚拟世界法律框架:智能合约与数字治理实践

1. 项目背景与核心价值"数字创世纪:在虚拟世界重写人类法典"这个项目名称本身就蕴含着深刻的时代命题。当元宇宙、数字孪生等技术从概念走向落地,我们突然发现:虚拟世界正在形成一套独立于现实社会的运行规则。去年某知名虚拟平台爆…

2026/10/28 9:23:49

智能运维AIOps核心技术解析与行业实践

1. 智能运维的行业现状与核心价值2008年亚马逊的一次服务器宕机事件,让全球首次意识到传统运维模式的脆弱性——仅31分钟的故障导致公司损失约6600万美元。这个标志性事件直接催生了智能运维(AIOps)概念的兴起。如今在数字化转型浪潮下&#…

2026/10/28 10:29:22

从光子计数到场景感知:单光子激光雷达技术发展现状与趋势

从光子计数到场景感知:单光子激光雷达技术发展现状与趋势 摘要:单光子激光雷达以光子级探测灵敏度突破了传统线性激光雷达在作用距离与弱回波条件下的性能边界,正在从实验室走向遥感测绘、智能驾驶与消费电子的规模化应用。当前该领域的技术演进呈现出两条相互交织的主线:…

2026/10/28 10:29:22

SpringBoot 结合Mybatis

新建项目后创建目录之后编写mapper类对应代码主方法的类中添加注释编写新增的方法确认返回结构Controller层代码编写启动后postman测试接口功能GetMapping("/{id}")GetMapping("list")PostMappingPutMappingDeleteMapping("/{id}")getAllUserSor…

2026/10/28 10:29:22

《人不知而不愠:一场关于“关山”与“为己之学”的独立探索》

《人不知而不愠:一场关于“关山”与“为己之学”的独立探索》撰写这篇长篇学术评论的缘起,始于重读李晨阳教授的《与时俱进的人类原则——提倡一种研究儒学的新进路》。李先生在文中提出,儒学要与时俱进,只需把孟子的“核心立场”…

2026/10/28 10:29:22

物业费太贵怎么办?别死磕降价,这两条合规省钱路更实在

每次在业主群里看到有人问“物业费太贵怎么办”,底下总是一水儿的“成立业委会换物业”或“拒交抗议”。但现实很骨感。中指研究院今年10月发布的数据摆在那:2026年全国物业服务满意度均值掉到了72.8分,住宅物业费收缴率也一直在82.67%左右徘…

2026/10/28 10:24:17

命令模式思想与 EvSim 事件调度

命令模式把一次操作请求封装成对象,使请求能够被保存、传递、排队,并在合适的时候执行。本文结合 EvSim 的事件机制,说明事件如何表达动作,以及事件队列和世界对象如何共同完成调度。在程序中,执行一个动作最直接的方式…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑