【C++模拟实现】list的模拟实现

【C++模拟实现】list的模拟实现

目录

  • 【C++模拟实现】list的模拟实现
      • list模拟实现的部分代码
      • list模拟实现中的要点
        • const_iterator的实现
        • push_back
        • operator运算符重载
        • iterator begin()函数


作者:爱写代码的刚子

时间:2023.9.3

前言:本篇博客关于list的模拟实现和模拟实现中遇到的问题

list模拟实现的部分代码

namespace test
{template<class T>struct list_node//默认公有{list_node<T>* _next;list_node<T>* _prev;T _val;list_node(const T& val = T()):_next(nullptr),_prev(nullptr),_val(val){}};template<class T,class Ref,class Ptr>struct __list_iterator{typedef list_node<T> Node;typedef __list_iterator<T, Ref, Ptr> Self;Node* _node;__list_iterator(Node* node=nullptr):_node(node){}__list_iterator(const Self&l):_node(l._node){}Ref operator*(){return _node->_val;}Ptr operator->(){return &_node->_val;}Self& operator++(){_node=_node->_next;return *this;}Self& operator++(int){Self tmp(_node);return tmp;}Self& operator--() {_node=_node->_prev;return *this;}Self& operator--(int) {Self tmp(*this);_node=_node->_prev;return *this;}bool operator!=(const Self& it) const//引用时一定要注意是否要加上const,防止权限放大,这里需要加上!!!{return _node!=it._node;}bool operator==(const Self& it) const{return _node==it._node;}};template<class T>class list{typedef list_node<T> Node;public:typedef __list_iterator<T, T& ,T*> iterator;typedef __list_iterator<T, const T& ,const T*> const_iterator;iterator begin(){//return _head->_next;return iterator(_head->_next);}iterator end(){//return _head;return iterator(_head);}list(){_head=new Node;_head->_prev=_head;_head->_next=_head;}~list(){clear();delete _head;_head=nullptr;}void clear(){iterator it = begin();while(it!=end()){it=erase(it);}}void push_back(const T& x){insert(end(),x);//注意这里是end(),不是end()-1;}void pop_back(){erase(--end());}iterator insert(iterator pos, const T& x){Node*newnode = new Node(x);pos._node->_prev->_next=newnode;newnode->_prev=pos._node->_prev;newnode->_next=pos._node;pos._node->_prev=newnode;return newnode;}iterator erase(iterator pos){Node*tmp=pos._node;Node*next=tmp->_next;tmp->_prev->_next=tmp->_next;tmp->_next->_prev=tmp->_prev;delete tmp;tmp = nullptr;return next;}private:Node* _head;};
}

list模拟实现中的要点

const_iterator的实现

我们选择使用模版参数,复用iterator的类,设置三个模版参数:template<class T,class Ref,class Ptr>并且typedef __list_iterator<T, const T& ,const T*> const_iterator,具体看代码的实现

push_back

push_back函数中复用了insert函数,但是注意的是传入的参数是end(),并不和pop_back函数中一样传入–end();

operator运算符重载

由于迭代器的实现类使用了模版参数,所以有两种类:const_iterator和iterator,所以在使用引用作为传入参数时需注意引用要加const!!!防止使用const_iterator类时权限放大!!!

iterator begin()函数

在此函数中可以使用return _head->_next;编译器会自动使用构造函数构造iterator类


附:类的拷贝构造一定要使用引用,并考虑是否再加上const。

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

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

相关文章

9月9日,每日信息差

今天是2023年9月9日&#xff0c;以下是为您准备的12条信息差 第一、前晨汽车动力电池项目落地厦门&#xff0c;第二十届中国国际投资贸易洽谈会于2023年9月8日在福建省厦门市开幕。会上&#xff0c;前晨汽车科技有限公司与福建省厦门市集美区进行了前晨汽车动力电池项目签约&a…

【刷题篇】贪心算法(一)

文章目录 分割平衡字符串买卖股票的最佳时机Ⅱ跳跃游戏钱币找零 分割平衡字符串 class Solution { public:int balancedStringSplit(string s) {int lens.size();int cnt0;int balance0;for(int i0;i<len;i){if(s[i]R){balance--;}else{balance;}if(balance0){cnt;}}return …

px、rpx、em以及rem的区别与用法

px、rpx、em、rem是用于网页开发中表示全屏宽度或元素尺寸的单位。 1. px&#xff08;像素&#xff09;&#xff1a;是最常见的单位&#xff0c;它表示屏幕上的实际像素点。在不同设备上&#xff0c;px 会根据屏幕的分辨率进行换算&#xff0c;因此在不同设备上显示效果可能会…

WPF CommunityToolkit.Mvvm Messenger通讯

文章目录 环境WeakReferenceMessenger方法介绍无回调订阅发送Token区分有回调订阅发送 环境 CommunityToolkit.Mvvm Messenger 十月的寒流: 如何使用 CommunityToolkit.Mvvm 中的 Messenger 来进行 ViewModel 之间的通信 WeakReferenceMessenger 我这里只讲简单的弱Messenger…

Spring云服务:如何将应用程序轻松迁移到云端

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

01-docker基础

为什么会有docker出现 docker之所以发展如此迅速&#xff0c;就是因为他给出了开发中应用的部署过程中的出现的环境变量、版本、配置问题等问题的标准解决方案——系统平滑移植&#xff0c;容器虚拟化技术。 因为环境配置相对麻烦&#xff0c;换一台机器就得重新来一次&#…

Android图形-Hardware Composer HAL

目录 一、引言 二、概览 三、实现HWC 3.1 为什么是HWC&#xff1f; 3.2 HWC的支持需求 3.3 HWC的实现思路 3.4 HWC的基元 3.5 HIDL接口 3.6 函数指针 3.7 图层和屏幕句柄 3.8 屏幕合成操作 3.9 多个屏幕 3.10 虚拟屏幕合成 3.10.1 模式 3.10.2 输出格式 3.11 同…

Qt 5.15编译(MinGW)及集成Crypto++ 8.8.0笔记

一、背景 为使用AES加密库&#xff08;AES/CBC加解密&#xff09;&#xff0c;选用Crypto 库&#xff08;官网&#xff09;。   最新Crypto C库依次为&#xff1a;8.8.0版本&#xff08;2023-6-25&#xff09;、8.7.0&#xff08;2022-8-7&#xff09;和8.6.0&#xff08;202…

jupylab pandas按条件批量处理xls数据

批量处理xls表数据 引入相关包 import pandas as pd import xlrd import numpy as np# 去掉jupyleb警告 import warnings warnings.filterwarnings("ignore")from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity…

如何利用 Selenium 对已打开的浏览器进行爬虫

大家好&#xff01; 在对某些网站进行爬虫时&#xff0c;如果该网站做了限制&#xff0c;必须完成登录才能展示数据&#xff0c;而且只能通过短信验证码才能登录 这时候&#xff0c;我们可以通过一个已经开启的浏览器完成登录&#xff0c;然后利用程序继续操作这个浏览器&…

【LeetCode-中等题】39. 组合总和

文章目录 题目方法一&#xff1a;递归回溯 题目 这题的nums数组里面不存在重复元素&#xff0c;所以也就无需做去重操作 但同一个元素可以被无限次取&#xff0c;说明每次递归中的for循环的开始位置就是自己 nums数组里面存在重复元素&#xff0c;去重版本&#xff1a; 方法一…

Git学习记录

Contest 一、工作区域二、操作命令2.1 创建仓库2.2 查看仓库状态2.3 从工作区向暂存区添加文件2.3.1 只添加一个文件2.3.2 添加全部文件 2.4 从暂存区向仓库区添加文件2.5 查询日志2.5.1 从当前版本开始查询2.5.2 查看所有日志 2.6 回滚2.6.1 从仓库回滚到工作区2.6.2 取消工作…

Redis 主从复制 + 哨兵模式 + Cluster 集群

redis群集 redis群集有三种模式&#xff1a; 分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 主从复制&#xff1a; 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现…

剑指 Offer 04. 二维数组中的查找

题目描述 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右 非递减 的顺序排序&#xff0c;每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该整数。 解题思路 注意每…

c++中的list容器讲解

文章目录 1. list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.6 list的迭代器失效 2. list的模拟实现2.1 模拟实现list 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 …

医疗知识图谱 neo4j

开源项目&#xff1a; https://github.com/liuhuanyong/QASystemOnMedicalKG 一.效果 二.需要安装&#xff1a; pip install pyahocorasick pip install py2neo 三.需要修改&#xff1a; 需要改的点&#xff1a; 1.改连接的方式 2.改读文件的方式 MedicalGraph 运行&am…

docker-compose安装Nacos2

文章目录 一. Mac1.1 数据库nacos_dev1.2 docker-compose.yaml1.3 部署1.4 卸载1.5 查看 二. Win102.1 docker-compose.yaml2.2 部署2.3 卸载 一. Mac 1.1 数据库nacos_dev sql文件地址 /** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache Li…

前端面试的话术集锦第 9 篇:高频考点(webpack性能优化)

这是记录前端面试的话术集锦第九篇博文——高频考点(webpack性能优化),我会不断更新该博文。❗❗❗ 在此章节中,我不会浪费篇幅给大家讲如何写配置文件。如果你想学习这方面的内容,那么完全可以去官网学习。在这部分的内容中,我们会聚焦于以下两个知识点,并且每一个知识…

C语言_指针(1)

文章目录 前言一、指针数组1.1利用指针数组模拟出二维数组 二、数组指针2.1数组名是数组首元素的地址2.2 二维数组传参2.3 一级指针传参2.4 二级指针传参 三. 函数指针四 . typedef 重命名 前言 指针数组是由指针组成的数组。它的每个元素都是一个指针&#xff0c;可以指向任何…

工商银行潍坊分行党建RPA机器人项目解析

01 案例背景&#xff1a;银行业掀起引入RPA加速实现数字化转型的浪潮 近年来&#xff0c;金融科技的蓬勃发展极大促进了银行的业务创新&#xff0c;新技术、新业态层出不穷。随着银行业务和科技的融合逐步落实&#xff0c;银行业务正朝着线上化、智能化转变。科技赋能的转型范…