list的模拟实现(一)

在这里插入图片描述

嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(一),下面让我们开始今天的学习吧!

list的模拟实现(一)

1.list splice接口的使用

2.list尾插的实现

3.list的迭代器模拟实现

4.const迭代器

5.insert和erase的模拟实现

1.list splice接口的使用

在这里插入图片描述

int main()
{std::list<int> mylist1;mylist1.push_back(1);mylist1.push_back(2);mylist1.push_back(3);mylist1.push_back(4);auto it = find(mylist1.begin(), mylist1.end(), 3);mylist1.splice(++mylist1.begin(), mylist1, it);//1324for (auto ch: mylist1){cout << ch << " ";}cout << endl;return 0;
}

在这里插入图片描述

2.list尾插的实现

在这里插入图片描述

3.list的迭代器模拟实现

原生指针的++是连续的物理空间的++。
因为类能进行运算符重载,我直接对节点进行++达不到我的要求,所以我就将节点指针封装成一个类,这个类的行为就是遍历双向循环列表
每一个类都有自己需要完成的事情,也可以是几个类互相搭配完成一件事情。

在这里插入图片描述

template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _date;ListNode(const T& date = T()):_next(nullptr),_prev(nullptr),_date(date){}};template<class T>class ListIterator{typedef ListNode<T> Node;//此处传T的时候就相当于实例化typedef ListIterator<T> self;public:ListIterator(Node* node)//用一个节点的指针来构造:_node(node){}//++itself& 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;
}T& operator*()
{return _node->_date;
}T* operator->()
{return &_node->_date;
}bool operator!=(const self& it)
{return _node != it._node;
}
bool operator==(const self& it)
{return _node == it._node;
}private://成员是一个节点的指针,将指针封装成类来达到我们想要实现的操作Node* _node;};template<class T>class list{public:typedef ListNode<T> Node;typedef ListIterator<T> iterator;//若T为int相当于实例化了一个int类型的iteratoriterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}list(){_head = new Node();_head->_next = _head;_head->_prev = _head;}void push_back(const T& x){Node* newnode = new Node(x);Node* tail = _head->_prev;//head  2  3   tail  newnodetail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;}private:Node* _head;};

iterator类不需要写析构函数,构造函数。节点是由链表管理的。(一般一个类不写析构函数,就不用写拷贝构造和赋值

在C、C++等语言中,指针访问结构体(struct)或联合体(union)的成员时,我们使用箭头(->)操作符。而当我们**直接访问结构体或联合体的成员(即不通过指针)时,我们使用点(.)**操作符。

注意:对于->操作符,可以得到一个指向节点有效数据的指针(下图pos坐标(中存储的是行和列)类似于节点中的_date),应该如下图注释所进行调用,但是编译器为了可读性,强行省略了一个箭头

在这里插入图片描述

struct pos
{int _row;int _col;pos(int row = 0,int col = 0 ):_row(row),_col(col){}};void list_test2()
{list<pos> it1;it1.push_back(pos(100,200));it1.push_back(pos(200,300));it1.push_back(pos(300,400));list<pos>::iterator it = ++it1.begin();while (it != it1.end()){cout << it->_col << ":" << it->_row <<endl;it++;}cout << endl;
}

匿名对象的临时对象可以调用非const的成员函数

4.const迭代器

const迭代器不能是普通迭代器前加const
const迭代器目标本身可以修改,指向的内容不能修改,类似const T* p

注意:不能在模板参数T前加上const

在这里插入图片描述

第一种方式:

template<class T>
class ListConstIterator
{typedef ListNode<T> Node;//此处传T的时候就相当于实例化typedef ListConstIterator<T> self;
public:ListConstIterator(Node* node)//用一个节点的指针来构造:_node(node){}//++itself& 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;}const T& operator*(){return _node->_date;}const T* operator->(){return &_node->_date;}bool operator!=(const self& it){return _node != it._node;}bool operator==(const self& it){return _node == it._node;}private://成员是一个节点的指针,将指针封装成类来达到我们想要实现的操作Node* _node;
};template<class T>
class list
{public:typedef ListNode<T> Node;typedef ListIterator<T> iterator;//若T为int相当于实例化了一个int类型的iteratortypedef ListConstIterator<T> const_iterator;iterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}const_iterator begin()const{return iterator(_head->_next);}const_iterator end()const{return iterator(_head);}

在这里插入图片描述

第二种方式:不同的模板参数表达的是不同的类,正如vector< int>和vector< double>表达的是两个不同的类

template<class T,class Ref,class Ptr>
class ListIterator
{typedef ListNode<T> Node;//此处传T的时候就相当于实例化typedef ListIterator<T,Ref,Ptr> self;
public:ListIterator(Node* node)//用一个节点的指针来构造:_node(node){}//++itself& 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;}Ref operator*(){return _node->_date;}Ptr operator->(){return &_node->_date;}bool operator!=(const self& it){return _node != it._node;}bool operator==(const self& it){return _node == it._node;}private://成员是一个节点的指针,将指针封装成类来达到我们想要实现的操作Node* _node;
};

5.insert和erase的模拟实现

链表的insert没有迭代器失效,erase迭代器有失效

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

好啦,今天的内容我们就学习到这里,如果大家觉得阿鑫写的不错的话,记得留下你的一键三连哦,期待我们的下一次相遇!

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

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

相关文章

Elasticsearch集群和Logstash、Kibana部署

1、 Elasticsearch集群部署 服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.56centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示…

【vue3+elementuiplus】el-select下拉框会自动触发校验规则

场景&#xff1a;编辑弹框省份字段下拉框必填&#xff0c;触发方式change&#xff0c;有值第一次打开不会触发校验提示&#xff0c;关闭弹框再次打开触发必填校验提示&#xff0c;但是该字段有值 问题的原因是&#xff1a;在关闭弹层事件中&#xff0c;我做了resetfileds&…

使用docker完整搭建前后端分离项目

1、docker的优势&#xff0c;为啥用docker 2、docker的核心概念 镜像【Image】- 只读模板 容器【Container】- 运行镜像的一个外壳&#xff0c;相当于一个独立的虚拟机 仓库【repository】- 镜像的管理工具&#xff0c;可公开&#xff0c;可私有&#xff1b;类似git仓库 3、c…

排序算法(二)

选择排序 &#xff1a; 思想&#xff1a; 每一轮把最小元素和未排序数组的第一个交换位置&#xff0c;直到全部排好序&#xff0c;最终为一个升序结果 代码展示&#xff1a; #include <stdio.h>int main(void) {int i, j; // 循环变量int MinIndex; // 保存最小的值的…

MySQL大表删除方案

1.问题 在生产环境中&#xff0c;执行大表删除操作时&#xff0c;很容易因为占用了大量io资源导致其他事务被阻塞&#xff0c;最终事务不断堆积导致MySQL挂掉。 2.drop命令 drop命令&#xff0c;MySQL主要干了两件事&#xff1a; 清除buffer pool缓冲&#xff08;内存&…

jmeter之MD5加密接口请求教程

前言&#xff1a; 有时候在项目中&#xff0c;需要使用MD5加密的方法才可以登录&#xff0c;或者在某一个接口中遇到 登录获取token后才可以进行关联&#xff0c;下面介绍下遇到的常见使用 一、第一种方法&#xff1a;使用jmeter自带的函数助手digest 选择工具&#xff0c;选择…

一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!

哈喽&#xff0c;大家好呀&#xff01;这里是码农后端。之前我给大家介绍了如何快速注册一个自己的域名&#xff0c;并创建一台自己的阿里云ECS云服务器。本篇将介绍如何将个人博客部署到云服务器&#xff0c;并进行域名备案与解析。 1、域名备案 注册了域名并购买了云服务器之…

识别鼠标绘制的数学公式网站

https://webdemo.myscript.com/views/math/index.html x n m x n x m x^{nm}x^{n}\times x^{m} xnmxnxm 使用"$$"进行包裹

unity开发Hololens,使用unity自带的UGUI

hololens 使用UGUI 新建画布&#xff0c;添加组件&#xff0c; 画布模式改成WorldSpace&#xff0c;这样在能在3D场景里 随意的移动位置&#xff0c; 添加NearIteractionTouchaBleUnityUI、CanvasUtility组件 EaventsToReceive改成Pointer&#xff0c; 这样&#xff0c;UGUI的…

Golang | Leetcode Golang题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; type pair struct {node *TreeNodeleft int }func pathSum(root *TreeNode, targetSum int) (ans [][]int) {if root nil {return}parent : map[*TreeNode]*TreeNode{}getPath : func(node *TreeNode) (path []int) {for ; node ! nil; no…

2024年中国电机工程学会杯数学建模思路 - 案例_ ID3-决策树分类算法

# 前言 2024电工杯(中国电机工程学会杯)数学建模思路解析 最新思路更新(看最新发布的文章即可): https://blog.csdn.net/dc_sinor?typebloghttps://blog.csdn.net/dc_sinor/article/details/128779911) 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就…

骑行 - 新区永旺出发的环太湖路线

环过好几次太湖&#xff0c;但对路线都没太在意&#xff0c;都是跟着别人走的。这次自己制定一个路书&#xff0c;方便下次自己一个人环太湖时使用。 开始是使用高德地图做路书&#xff0c;只能在PC上做。我用的是网页版&#xff0c;每次选点太麻烦了。要输入地址搜索&#xff…

Nginx代理配置(专业版)

写在前面提醒&#xff1a;使用代理&#xff0c;如果可以&#xff0c;请尽量支持双协议&#xff0c;http、https均要支持哈。 注意&#xff1a;监控系统只是运行代码&#xff0c;是否支持https&#xff0c;需要运维同学在你们的服务器上配置https证书&#xff0c;配置好证书&…

探索集合python(Set)的神秘面纱:它与字典有何不同?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、集合&#xff08;Set&#xff09;与字典&#xff08;Dictionary&#xff09;的初识 1. …

Mysql函数

字符串函数 concat(s1,s2…sn)把传入的参数连接成一个字符串 注意&#xff1a;任何字符串与NULL进行连接的结果都将是NULL insert(str&#xff0c;x&#xff0c;y&#xff0c;instr)函数&#xff1a;将字符串str从第x位置开始&#xff0c;y个字符长度的字串替换为instr lower…

从“反超”到“引领”,中国卫浴品牌凭何遥遥领先?

作者 | 曾响铃 文 | 响铃说 前不久&#xff0c;第28届中国国际厨房、卫浴设施展览会(以下简称“中国国际厨卫展”)在上海如期举行&#xff0c;就结果来说真的让人大开眼界。 冲水声比蚊子声更小的马桶、能化身无感交互平台的魔镜柜、可以语音交互的淋浴器&#xff0c;这些“…

类与对象(上)

目录 ​编辑 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 4.1 访问限定符 【面试题】 4.2 封装 【面试题】 五、类的作用域 六、类的实例化 七、类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结…

Yolov9调用COCOAPI生成APs,APm,APl

最近在做小目标检测的东西&#xff0c;因为后期毕业论文需要&#xff0c;所以开始使用Yolov9模型&#xff0c;运行val.py的时候不会自己产生小目标的AP指标&#xff0c;所以研究了一下&#xff0c;步骤非常简单&#xff1a; 第一步&#xff1a; 在数据集中生成json格式的Annota…

ROS参数服务器

一、介绍 参数服务器是用于存储和检索参数的分布式多机器人配置系统&#xff0c;它允许节点动态地获取参数值。 在ROS中&#xff0c;参数服务器是一种用于存储和检索参数的分布式多机器人配置系统。它允许节点动态地获取参数值&#xff0c;并提供了一种方便的方式来管理和共享配…

开源大模型与闭源大模型

概述 开源大模型和闭源大模型是两种常见的大模型类型&#xff0c;它们在以下方面存在差异&#xff1a; 开放性&#xff1a; 开源大模型&#xff1a;代码和模型结构是公开可用的&#xff0c;任何人都可以访问、修改和使用。闭源大模型&#xff1a;模型的代码和结构是私有的&…