list 简化版模拟实现

 1ListNode

template<class T>struct ListNode{public:ListNode(const T& x = T()):_next(nullptr), _prev(nullptr), _data(x){}//private://共有可访问ListNode<T>* _next;ListNode<T>* _prev;T _data;};

 实现iterator对Node*的封装  实现运算符重载

 

void const_print(const MyList::list<int>& lt)//这里的const本意是lt的node中的data不可改,却使lt不可改
//const迭代器是指, it已经封装过,把it当作指向node中的data的指针    it内的_node 的
{MyList::list<int>::const_iterator it = lt.begin();//所以应该是 通过函数重载,返回一个迭代器,不能支持对(*it)的改动while (it != lt.end()){//报错,必须是可修改的左值  *it += 19;//*it += 19;cout << (*it) << ' ';it++;}cout << endl;
}

 2ListIterator

template<class T, class Ref, class Ptr>class ListIterator{public:typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;//变化ListIterator(Node* node):_node(node){}Ref operator*()//变化{return _node->_data;}Ptr operator->()//变化{return &(_node->_data);}Self& operator++(){_node = _node->_next;return *this;}Self operator++(int){Self tmp = *this;_node = _node->_next;return tmp;}Self& operator--(){_node = _node->_prev;return *this;}Self operator--(int){Self tmp = *this;_node = _node->_prev;return tmp;}bool operator!=(Self it){return _node != it._node;}//private:   共有Node* _node;};

 3list

template<class T>class list{public:typedef ListNode<T> Node;//typedef ListIterator<T> iterator;//typedef ListConstIterator<T> const_iterator;//但这样要实现两个类 可以合并typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const  T*> const_iterator;iterator begin()//头是head下一个节点{return _head->_next;//单参数的自定义类型支持隐式类型转化  c++11对于多参数的也可以{xx,xx,xx}}iterator end()//尾是head{return _head;}const_iterator begin()const//直接加const 对于const对象能调用,然后刚好构成函数重载,{return _head->_next;//返回值也不能是 const itertor 这指的是it不能改,应该封装成(*it)不可改}const_iterator end()const{return _head;}void empty_init(){//先new一个节点_head = new Node;_head->_next = _head;_head->_prev = _head;}list(initializer_list<T>il){empty_init();for (auto& e : il)push_back(e);}list(){empty_init();}list(const list<T>& lt){empty_init();for (auto& i : lt)//要引用 有可能是自定义类型{push_back(i);}}/*void push_back(const T& x){Node* newnode = new Node(x);Node* tail = _head->_prev;tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;}*/void push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_back(){erase(--end());//不能是-1,没有重载}void pop_front(){erase(begin());}void insert(iterator pos, T val){Node* cur = pos._node;Node* prev = cur->_prev;Node* newnode = new Node(val);prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;}iterator erase(iterator pos)//迭代器失效  返回next{Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;//return iterator(next);}size_t size(){size_t sz = 0;for (auto i : (*this))sz++;return sz;}bool empty(){return size() == 0;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}~list(){clear();delete _head;}private:Node* _head;};

 4对于const迭代器的解释和->操作符重载

struct A
{int _a1;int _a2;A(int a1 = 0, int a2 = 0):_a1(a1), _a2(a2){}
};
void const_print(const MyList::list<int>& lt)//这里的const本意是lt的node中的data不可改,却使lt不可改(
//const迭代器是指, it已经封装过,把it当作指向node中的data的指针    
{MyList::list<int>::const_iterator it = lt.begin();//所以应该是 通过函数重载,返回一个迭代器,不能支持对(*it)的改动while (it != lt.end()){//报错,必须是可修改的左值  *it += 19;//*it += 19;cout << (*it) << ' ';it++;}cout << endl;
}
void print(MyList::list<int>& lt)
{MyList::list<int>::iterator it = lt.begin();while (it != lt.end()){*it += 19;cout << (*it) << ' ';it++;}cout << endl;
}
void test2()
{MyList::list<A>lt;lt.push_back({ 1,2 });//隐式类型转换,c++11lt.push_back({ 1,2 });lt.push_back({ 1,2 });MyList::list<A>::iterator it = lt.begin();while (it != lt.end()){//报错cout << (*it) << " ";//(*it)访问的是 节点的数据 对于int 数据就是int 支持流输出 ,这里是A对象//其实就是把it当作 指向A的指针,但本质不是    (*it)就是A  //就是(*it)经过封装,(*it)就是A  ,,但it->没封装//cout << (*it)._a1 << "." << (*it)._a2<<endl;//但本应该it->data  要支持->重载  返回值是_data *cout << it->_a1 << "." << it->_a2 << endl;it++;}cout << endl;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/816398.shtml

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

相关文章

万字长文深入理解Docker镜像分层原理、容器数据卷、网络通信架构(Docker系列第2章,共3章)

镜像分层的简单直观体现 在执行docker pull时&#xff0c;会发现多个Pull complete 字样&#xff0c;就能体现分层&#xff0c;如果是一个文件&#xff0c;只会有一个Pull complete 。 docker pull redis Using default tag: latest latest: Pulling from library/redis a2ab…

算法中的复杂度(先做个铺垫)

文章目录 定义与分类时间复杂度概念大O的渐进表示法举例情况注意内涵 空间复杂度最优解 定义与分类 复杂度&#xff1a;衡量算法效率的标准时间效率&#xff1a;衡量这个算法的运行速度&#xff0c;也就是我们常说的时间复杂度空间效率&#xff1a;衡量这个算法所需要的额外空…

ChatGPT 专属指南:利用ChatGPT提升论文写作效率

ChatGPT无限次数:点击直达 ChatGPT 专属指南&#xff1a;利用ChatGPT提升论文写作效率 引言 随着人工智能技术的不断发展&#xff0c;如今许多工具被开发出来&#xff0c;以帮助人们更高效地进行各种工作。其中&#xff0c;ChatGPT作为一个强大的语言生成模型&#xff0c;不仅…

分布式结构化数据表Bigtable

文章目录 设计动机与目标数据模型行列时间戳 系统架构主服务器Chubby作用子表服务器SSTable结构子表实际组成子表地址组成子表数据存储及读/写操作数据压缩 性能优化局部性群组&#xff08;Locality groups&#xff09;压缩布隆过滤器 Bigtable是Google开发的基于GFS和Chubby的…

云计算:Linux 部署 OVN 集群

目录 一、实验 1.环境 2.Linux 部署 OVN 集群&#xff08;中心端&#xff09; 3.Linux 部署 OVN 集群&#xff08;业务端1&#xff09; 4.Linux 部署 OVN 集群&#xff08;业务端2&#xff09; 4.OVN 中心端 连接数据库 5.OVN 业务端1 加⼊控制器 6.OVN 业务端2 加⼊控…

【uniapp】初始化项目

初始化uniapp项目 创建 Vue3/Vite 工程 # 创建以 javascript 开发的工程 npx degit dcloudio/uni-preset-vue#vite my-vue3-project # 创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 如果报错&#xff0c;或者网络问你等无法…

强大的压缩和解压缩工具 Keka for Mac

Keka for Mac是一款功能强大的压缩和解压缩工具&#xff0c;专为Mac用户设计。它支持多种压缩格式&#xff0c;包括7z、Zip、Tar、Gzip和Bzip2等&#xff0c;无论是发送电子邮件、备份文件还是节省磁盘空间&#xff0c;Keka都能轻松满足用户需求。 这款软件的操作简单直观&…

Tesserocr 的安装步骤

Tesserocr 的安装 OCR&#xff0c;即 Optical Character Recognition&#xff0c;光学字符识别。是指通过扫描字符&#xff0c;然后通过其形状将其翻译成电子文本的过程。那么对于图形验证码来说&#xff0c;它都是一些不规则的字符&#xff0c;但是这些字符确实是由字符稍加扭…

数据结构与算法——20.B-树

这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前&#xff0c;我们回顾一下我们学的树。 首先是二叉树&#xff0c;这个不用多说&#xff…

Linux的文件操作中的静态库的制作

Linux操作系统支持的函数库分为&#xff1a; 静态库&#xff0c;libxxx.a&#xff0c;在编译时就将库编译进可执行程序中。 优点&#xff1a;程序的运行环境中不需要外部的函数库。 缺点&#xff1a;可执行程序大 &#xff08;因为需要 编译&#xff09; 动态库&#xff0c…

Spring Cloud学习笔记:Eureka集群搭建样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、项目架构2、Dependency3、项目启动类4、application.yml5、启动项目 1、项目架构 因为这是单机模拟集群搭建&#xff0c;为了方便管理就都放在了一个项目中。这次准备搭建三个项目server1, server2, server3 …

常见的垃圾回收算法

文章目录 1. 标记清除算法2. 复制算法3. 标记整理算法4. 分代垃圾回收算法 1. 标记清除算法 核心思想&#xff1a; 标记阶段&#xff0c;将所有存活的对象进行标记。Java中使用可达性分析算法&#xff0c;从GC Root开始通过引用链遍历出所有存活对象。清除阶段&#xff0c;从…

ES6 的解构赋值

解构赋值&#xff08;Destructuring assignment&#xff09;是一种方便快捷的方式&#xff0c;可以从对象或数组中提取数据&#xff0c;并将数据赋值给变量。解构赋值是ES6中一项强大且常用的特性. 1. 基本数组解构 首先&#xff0c;让我们看看如何对数组进行解构赋值。假设我…

IT运维中负载均衡的原理,包括它的作用、原理和算法优化

负载均衡在IT运维中扮演着重要的角色&#xff0c;它能够提高系统的性能、可靠性和可扩展性。本文将详细介绍负载均衡的原理、作用、优化方面以及几种常见的负载均衡算法&#xff0c;并提供一些具体的应用示例。 一、负载均衡的作用 负载均衡的主要作用是将客户端请求均匀地分…

C++ 泛型编程 模板

1.模板 就是建立通用的模具&#xff0c;大大提高复用性 模板的特点&#xff1a; 模板不可以直接使用&#xff0c;它只是一个框架 模板的通用并不是万能的 * C另一种编程思想称为 泛型编程 &#xff0c;主要利用的技术就是模板 * C提供两种模板机制:**函数模板**和**类模板*…

快速配置docker 国内源地址

前言 用于快速配置docker国内镜像&#xff0c;和自定义的docker存储路径。 执行代码 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://dockerproxy.com","https://docker.mirrors.ustc.…

webrtc中的Track,MediaChannel,MediaStream

文章目录 Track,MediaChannel,MediaStream的关系MediaStream的创建流程创建VideoChannel的堆栈创建VideoStream的堆栈 sdp中媒体参数信息的映射sdp中媒体信息参数设置体系参数设置流程参数映射体系 Track,MediaChannel,MediaStream的关系 Audio/Video track&#xff0c;MediaC…

[每周一更]-第93期:探索大型生成式聊天工具:从ChatGPT到未来

随着人工智能技术的不断进步&#xff0c;生成式聊天工具正逐渐成为人们日常生活中的一部分。这些工具利用深度学习技术和大规模语言模型的强大能力&#xff0c;能够与用户进行自然、流畅的对话&#xff0c;为我们提供了更加智能和个性化的交流体验。 ChatGPT&#xff1a;开启生…

[前端][杂项] React版本

前言 前端框架版本迭代很快&#xff0c;所以熟悉框架的版本也很重要。 React 版本介绍 。github上有更加详细的文档 React历史版本下载 因为 React 使用的是 jsx 如果要在浏览器环境中使用 jsx 那么还需要使用babel.js把jsx转换成原生js文件才能被浏览器使用。 babel官网 babe…

基于RT-Thread(RTT)的BMP280气压计驱动(I2C通信)

前言 本文基于RTT操作系统使用STM32F401RET6驱动BMP280气压计模块&#xff0c;使用I2C协议通信 一、新建工程 二、添加软件包 三、添加这个包 四、打开CubeMX 五、配置时钟源&#xff0c;使用外部晶振 六、配置串行下载口 七、打开I2C&#xff0c;我这里使用的是I2C2&#x…