当前位置: 首页 > news >正文

C++list的模拟实现

为了实现list,我们需要实现三个类

一、List的节点类

template<class T>
struct ListNode
{ListNode(const T& val = T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val;
};

二、List的迭代器类

template<class T, class Ref, class Ptr>
class ListIterator
{typedef ListNode<T>* PNode;typedef ListIterator<T, Ref, Ptr> Self;
public:ListIterator(PNode pNode = nullptr):_pNode(pNode){}ListIterator(const Self& l):_pNode(l._pNode){}T& operator*(){return _pNode->_val;}T* operator->(){return &(_pNode->_val);}Self& operator++()//前置++{_pNode = _pNode->_pNext;return *this;}Self operator++(int)//后置++{Self tmp(*this);_pNode = _pNode->_pNext;return tmp;}Self& operator--(){_pNode = _pNode->_pPre;return *this;}Self& operator--(int){Self tmp(*this);_pNode = _pNode->_pPre;return tmp;}bool operator!=(const Self& l){return _pNode != l._pNode;}bool operator==(const Self& l){return _pNode == l._pNode;}PNode _pNode;
};

三、List类

1.数据定义相关

template<class T>
class list
{typedef ListNode<T> Node;typedef Node* PNode;
public:typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T&> const_iterator;
private:void CreateHead()//初始化{_pHead = new Node;_pHead->_pNext = _pHead;_pHead->_pPre = _pHead;_size = 0;}PNode _pHead;//头指针size_t _size;
};

2.构造函数相关

public:///// List的构造list(){CreateHead();}list(int n, const T& value = T()){CreateHead();for (int i = 0; i < n; i++){push_back(value);}}template <class Iterator>list(Iterator first, Iterator last){CreateHead();while (first != last){push_back(*first);first++;}}list(const list<T>& l){CreateHead();for (auto& e : l){push_back(e);}}list<T>& operator=(list<T> l){swap(l);return *this;}~list(){clear();delete _pHead;_pHead = nullptr;}

3.迭代器相关

///
// List Iterator
iterator begin()
{return iterator(_pHead->_pNext);
}
iterator end()
{return iterator(_pHead);
}
const_iterator begin() const
{return const_iterator(_pHead->_pNext);
}
const_iterator end() const
{return const_iterator(_pHead);
}

4.容量相关

///
// List Capacity
size_t size()const
{return _size;
}
bool empty()const
{return _size == 0;
}

5.数据访问相关


// List Access
T& front()
{return _pHead->_pNext->_val;
}
const T& front()const
{return _pHead->_pNext->_val;
}
T& back()
{return _pHead->_pPre->_val;
}
const T& back()const
{return _pHead->_pPre->_val;
}

6.修改数据相关


// List Modify
void push_back(const T& val) 
{ insert(end(), val); 
}
void pop_back() 
{ erase(--end());
}
void push_front(const T& val) 
{ insert(begin(), val); 
}
void pop_front() 
{ erase(begin()); 
}
// 在pos位置前插入值为val的节点
void insert(iterator pos, const T& val)
{PNode pcur = pos._pNode;PNode newnode = new Node(val);PNode prev = pcur->_pPre;newnode->_pNext = pcur;newnode->_pPre = prev;pcur->_pPre = newnode;prev->_pNext = newnode;_size++;
}
// 删除pos位置的节点,返回该节点的下一个位置
iterator erase(iterator pos)
{PNode pdel = pos._pNode;PNode prev = pdel->_pPre;PNode next = pdel->_pNext;next->_pPre = prev;prev->_pNext = next;delete pdel;_size--;return iterator(next);
}
void clear()
{iterator it = begin();while (it != end()){it = erase(it);}
}
void swap(list<T>& l)
{std::swap(_pHead, l._pHead);std::swap(_size, l._size);
}

四、测试一下我们自己写的List

所用测试程序test.cpp

#include"List.h"
using namespace std;
///
// 对模拟实现的list进行测试
// 正向打印链表
template<class T>
void PrintList(const bite::list<T>& l)
{auto it = l.begin();while (it != l.end()){cout << *it << " ";++it;}cout << endl;
}// 测试List的构造
void TestBiteList1()
{cout << "-----------------TestBiteList1()-----------------" << endl;bite::list<int> l1;bite::list<int> l2(10, 5);PrintList(l2);int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };bite::list<int> l3(array, array + sizeof(array) / sizeof(array[0]));PrintList(l3);bite::list<int> l4(l3);PrintList(l4);l1 = l4;PrintList(l1);
}// PushBack()/PopBack()/PushFront()/PopFront()
void TestBiteList2()
{cout << "-----------------TestBiteList2()-----------------" << endl;// 测试PushBack与PopBackbite::list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);PrintList(l);l.pop_back();l.pop_back();PrintList(l);l.pop_back();cout << l.size() << endl;// 测试PushFront与PopFrontl.push_front(1);l.push_front(2);l.push_front(3);PrintList(l);l.pop_front();l.pop_front();PrintList(l);l.pop_front();cout << l.size() << endl;
}// 测试insert和erase
void TestBiteList3()
{cout << "-----------------TestBiteList3()-----------------" << endl;int array[] = { 1, 2, 3, 4, 5 };bite::list<int> l(array, array + sizeof(array) / sizeof(array[0]));auto pos = l.begin();l.insert(l.begin(), 0);PrintList(l);++pos;l.insert(pos, 2);PrintList(l);l.erase(l.begin());l.erase(pos);PrintList(l);// pos指向的节点已经被删除,pos迭代器失效cout << *pos << endl;auto it = l.begin();while (it != l.end()){it = l.erase(it);}cout << l.size() << endl;
}
int main()
{TestBiteList1();TestBiteList2();TestBiteList3();return 0;
}

测试结果

相关文章:

C++list的模拟实现

为了实现list&#xff0c;我们需要实现三个类 一、List的节点类 template<class T> struct ListNode {ListNode(const T& val T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val; }; 二、List的迭代器…...

Leetcode 187. 重复的DNA序列

DNA序列 由一系列核苷酸组成&#xff0c;缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如&#xff0c;“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA 分子中出现不…...

都江堰泛计算操作系统(多机)应用方向

1、异构多核芯片 DJYOS是全球唯一支持异构多核的操作系统。当前的系统级芯片&#xff0c;为了适应多样化的用户需求&#xff0c;基本上都采用了异构多核架构。传统操作系统就需要在一个芯片内&#xff0c;运行多种操作系统&#xff0c;开发工作更加复杂&#xff0c;运行协同性低…...

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(论文更新)

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索更新&#xff08;论文更新&#xff09; ​ 本节主要更新了论文、训练日志的log数据提取&#xff08;Loss、ACC、RK&#xff09;等数据可视化作图的代码 B题交流QQ群&#xff1a; 4583…...

蓝桥杯22年第十三届省赛-统计子矩阵|一维前缀和加双指针

题目链接&#xff1a; 1.统计子矩阵 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2022年第十三届省赛真题-统计子矩阵 - C语言网 (dotcpp.com) 说明&#xff1a; 涉及到子矩阵的时候&#xff0c;一般就跟前缀和相关&#xff0c;可以降维。 先回顾一下最大子矩阵&#xff0c;回忆一下一…...

SaaS 电商设计 (十) 记一次 5000kw 商品数据ES迁移 (详细的集群搭建以及线上灰度过程设计)

目录 一.背景二.技术目标三.技术方案3.1 整体流程3.2 ES 切换前:完成整体新集群的搭建.i:拓扑结构设计ii: 如何选择整体的 **ES** 集群配置. 3.3 **ES** 版本切换中3.3.1 多client版本兼容3.3.2 Router的设计 3.4 ES 切换后3.5 开箱即用 四.总结 专栏系列 -SaaS 电商设计 (一) …...

linux安装Tomcat

linux安装Tomcat 下载地址&#xff1a;https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.87/bin/apache-tomcat-8.5.87.tar.gz 将下载的安装包传到该文件夹 解压安装包 tar -zxvf apache-tomcat-8.5.87.tar.gz 配置环境变量 vim /etc/profile 添加指定文件最下方 expo…...

【机器学习300问】57、机器是如何读得懂文本数据的呢?

你知道的&#xff0c;人工智能的大佬们想方设法的让机器具备人一样的能力&#xff0c;比如读懂文本的能力。既然机器是在模仿人类&#xff0c;那么问题“机器是如何读得懂文本数据的呢&#xff1f;”就可以变成“人是如何读得懂文本数据的呢&#xff1f;” 一、人是如何读得懂…...

了解XSS和CSRF攻击与防御

什么是XSS攻击 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者在受害者的浏览器上执行恶意脚本。这种攻击通常发生在 web 应用程序中&#xff0c;攻击者通过注入恶意脚本来利用用户对网站的信任&…...

NEO 学习之 MLE(最大似然估计)

文章目录 简单题目MLE 在不同的分布的运用正态分布指数分布均匀分布泊松分布 如何理解 最大似然估计&#xff1f; 就是我们先取出一堆样本&#xff0c;得到一个L( θ \theta θ) 函数&#xff0c;然后的话&#xff0c;这个是关于 θ \theta θ 的一个函数&#xff0c;那么由于存…...

going和Java对比有什么不同

语法风格&#xff1a;Golang 和 Java 的语法风格有很大的不同。Golang 更加简单&#xff0c;语法类似于 C 语言&#xff0c;而 Java 比较复杂&#xff0c;语法类似于 C。 并发&#xff1a;Golang 在并发方面有很大的优势&#xff0c;支持轻量级线程 goroutine 和 channel 通信…...

RabbitMQ面经 手打浓缩版

保证可靠性 生产者 本地事务完成和消息发送同时完成 通过事务消息完成 重写confirm在里面做逻辑处理 确保发送成功&#xff08;不成功就放入到重试队列&#xff09; MQ 打开持久化确保消息不会丢失 消费者 改成手动回应 不重复消费 生产者 保证不重复发送消息 消费者…...

JavaScript引用数据类型

JS总共分为两种数据类型&#xff1a; 1.基本数据类型 2.引用数据类型 基本数据类型在之前的文章中待大家了解过了 今天我们就来了解一下引用数据类型&#xff1a; 首先呢&#xff0c;我们要知道引用数据类型是存储在哪里的&#xff1a;引用数据类型是存放在堆内存中的对象…...

Mac m1 Flink的HelloWorld

首先在官方下载Downloads | Apache Flink 下载好压缩包后解压&#xff0c;得到Flink文件夹 进入&#xff1a;cd flink-1.19.0 ls 查看里面的文件&#xff1a; 执行启动集群 ./bin/start-cluster.sh 输出显示它已经成功地启动了集群&#xff0c;并且正在启动 standalonesessio…...

3.1 Python变量的定义和使用

Python变量的定义和使用 任何编程语言都需要处理数据&#xff0c;比如数字、字符串、字符等&#xff0c;我们可以直接使用数据&#xff0c;也可以将数据保存到变量中&#xff0c;方便以后使用。 变量&#xff08;Variable&#xff09;可以看成一个小箱子&#xff0c;专门用来…...

OceanBase中左外连接和反连接的经验分享

本文作者&#xff1a;张瑞远&#xff0c;曾从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级IT系统及数据库的规划设计、架构设计、运维实施、运维服务、故障处理、性能优化等工作。 持有Orale OCM,MySQL OCP及国产代表数据库认证。 获得的专业技能与认证…...

如何提升公众号搜索量?分享内部运营的5步优化技术!

最近一直有自媒体同行朋友在写关于公众号的内容&#xff0c;很多都说公众号现在没得玩了。其实&#xff0c;在运营自媒体上面&#xff0c;思维不通&#xff0c;技术不到位&#xff0c;哪个平台都不适合你玩。 想要在自媒体上面运营变现&#xff0c;一定不要先点击广告变现&…...

【2024】根据系统平均负载情况排查隐患

查看系统负载情况的时候可以使用top和uptime命令。 其中top是一个比较综合的命令,如果我们只需要查看负载情况,可以直接使用uptime命令即可。 uptime命令是一个查看系统运行时间和负载情况的命令,分为四个部分: 系统当前时间系统运行时间当前登录用户数系统平均负载:分别…...

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…...

android 音视频基础知识--个人笔记

avi&#xff0c;mkv封装格式数据------》音频流&#xff0c;视频流//字母流&#xff08;国外会分开&#xff09; ----〉解封装&#xff0c;解复用打开封装格式 -----》视频压缩数据---压缩H264&#xff0c;H265 -------〉视频解码 ----》原始数据YUV -----〉音频压缩数据---…...

信息工程大学第五届超越杯程序设计竞赛(同步赛)题解

比赛传送门 博客园传送门 c 模板框架 #pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc.h> #define rep(i,a,b) for (int ia;i<b;i) #define per(i,a,b) for (int ia;i>b;--i) #define se second #define fi first #define e…...

Python:文件读写

一、TXT文件读写 Python中用open()函数来读写文本文件&#xff0c;返回文件对象&#xff0c;以下是函数语法。 open(<name>, <mode>, <buffering>&#xff0c;<encoding)name&#xff1a;文件名。 mode&#xff1a;打开文件模式。 buffering&#xff1a;设…...

10.windows ubuntu 组装软件:spades,megahit

Spades 是一种用于组装测序数据的软件&#xff0c;特别适用于处理 Illumina 测序平台产生的数据。它的全称是 "St. Petersburg genome assembler"&#xff0c;是一款广泛使用的基因组组装工具。 第一种&#xff1a;wget https://cab.spbu.ru/files/release3.15.3/S…...

K8S之Secret的介绍和使用

Secret Secret的介绍Secret的使用通过环境变量引入Secret通过volume挂载Secret Secret的介绍 Secret是一种保护敏感数据的资源对象。例如&#xff1a;密码、token、秘钥等&#xff0c;而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使…...

git下载安装教程

git下载地址 有一个镜像的网站可以提供下载&#xff1a; https://registry.npmmirror.com/binary.html?pathgit-for-windows/图太多不截了哈哈&#xff0c;一直next即可。...

《剑指 Offer》专项突破版 - 面试题 98、99 和 100 : 和动态规划相关的矩阵路径问题(C++ 实现)

目录 前言 面试题 98 : 路径的数目 面试题 99 : 最小路径之和 面试题 100 : 三角形中最小路径之和 前言 矩阵路径是一类常见的可以用动态规划来解决的问题。这类问题通常输入的是一个二维的格子&#xff0c;一个机器人按照一定的规则从格子的某个位置走到另一个位置&#…...

KY145 EXCEL排序(用Java实现)

描述 Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。 对每个测试用例&#xff0c;首先输出1行“Case i:”&#xff0c;其中 i 是测试用例的编号&#xff08;从1开始&#xff09;。随后在 N 行中输出按要求排序后的结果&#xff0c;即&#xff1a;当 C…...

属性选择器

1.[title]{background:yellow;}&#xff1a;所有带title标签设置成黄色 2.div[class]{background:yellow;}&#xff1a;所有div中带class标签设置成黄色 3.div[classbox1]{border:1px solid blue; }&#xff1a;div中包含class并且classbox1的设置成蓝边框 4. class…...

软考 - 系统架构设计师 - 关系模型的完整性规则

前言 关系模型的完整性规则是一组用于确保关系数据库中数据的完整性和一致性的规则。这些规则定义了在关系数据库中如何存储、更新和查询数据&#xff0c;以保证数据的准确性和一致性。 详情 关系模型的完整性规则主要包括以下三类&#xff1a; 实体完整性规则 这是确保每个…...

写了几个难一点的sql

写了几个难一点的sql SELECT bn.id AS book_node_id, t.version_id, bn.textbook_id, s.id AS subject_id, s.stage_id, COUNT( CASE WHEN d.document_type_id 1 AND d.scope IS NULL AND p.document_id IS NOT NULL THEN 1 END ) AS type_1_count, COUNT( CASEWHEN d.docume…...

网站怎么推广软文/百度如何免费推广

2019独角兽企业重金招聘Python工程师标准>>> 当需要成批插入或者更新记录时。可以采用Java的批量更新机制&#xff0c;这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。 JDBC的批量处理语句包括下面两个方法&#xff1a; addBa…...

哪个网站可以代做试题/新闻头条最新消息今天发布

process.cwd() 是当前执行node命令时候的文件夹地址 ——工作目录&#xff0c;保证了文件在不同的目录下执行时&#xff0c;路径始终不变__dirname 是被执行的js 文件的地址 ——文件所在目录 Nodejs官方文档上的解释&#xff1a; > process.cwd(): The process.cwd() metho…...

网站怎么才能被百度收录/爱站关键词挖掘old

在android中的文件放在不同位置&#xff0c;它们的读取方式也有一些不同。 一、资源文件的读取&#xff1a; 1) 从resource的raw中读取文件数据&#xff1a; ?1234567891011121314151617181920212223String res "";try{//得到资源中的Raw数据流InputStream in get…...

网站建设的流程推广方案/成品ppt网站国外

硬件环境介绍&#xff1a;最近花了两周终于建成了Hyper-V Failover Clustering&#xff0c;多数时间基本上用在了去了解HP的刀片服务器及VC模块配置&#xff0c;由于是第一次使用所以去查询了很多文档&#xff0c;经过此次部署也对HP的刀片服务器有了点基本了解。先介绍下所使用…...

徐州建设网站/企业培训课程ppt

文章目录单体架构实例分析与比较单体架构优点单体架构缺点改进微服务服务注册服务访问分布式集群单体架构实例 在Idea里新建一个SpringBoot项目&#xff0c; 这里选择SpringBoot 的版本依赖是 2.0.3.RELEASE。 依赖 pom.xml如下&#xff1a; <?xml version"1.0&quo…...

p2p网站制作郑州/百度推广没有一点效果

我在绘制简单的折线图时遇到了问题&#xff0c;在y轴上有数值&#xff0c;其中轴上的日期是&#xff1a;我的python代码如下&#xff1a;i 0 #iterator for weather dataxAxis []yAxis []for trainingDate in observations[:,0]: #getting values in x and y axis for the d…...