【1++的C++初阶】之list

👍作者主页:进击的1++
🤩 专栏链接:【1++的C++初阶】

文章目录

  • 一,什么是list
  • 二,构造与析构
    • 2.1 结点结构
    • 2.2 链表结构
    • 2.3 迭代器结构
  • 三,部分重要接口的作用及其实现
    • 3.1 迭代器相关的接口
    • 3.2 list相关接口

一,什么是list

list是可以在常数范围内进行任意插入和删除的序列式容器。
list底层是前后循环链表,因此可以双向前后迭代。与其他序列式容器相比,list的最大缺陷是不支持任意位置的随机访问。并且list还需要一些额外的空间来保存结点与结点间的相关联信息。

二,构造与析构

2.1 结点结构

template<class T>struct list_node{list_node* prev;//指向上一个结点list_node* next;//指向下一个结点T data;//构造list_node(const T& val = T()):data(val), prev(nullptr), next(nullptr){}};

在此结构中,定义出来了指向结点的前后指针,结点数据类型并对上述成员变量进行了初始化。

2.2 链表结构

template<class T>class list{public:typedef list_node<T> Node;//构造list(){_head = new Node;_head->prev = _head;_head->next = _head;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}//拷贝构造template <class InputIterator>list(InputIterator first, InputIterator last){_head = new Node;_head->prev = _head;_head->next = _head;while (first != last){push_back(*first);first++;}}//拷贝构造//现代写法list(const list<T>& lt){_head = new Node;_head->prev = _head;_head->next = _head;list<T> tmp(lt.begin(), lt.end());std::swap(_head, tmp._head);}~list(){clear();delete _head;_head = nullptr;}private:Node* _head;	};

此结构中定义了头结点,并对头结点进行了初始化,使其指向上一个的指针指向自己,指向下一个的指针指向自己。
拷贝构造我们用的是现代写法,通过迭代器构造,构造出一个临时对象,再将其头结点指针进行交换。需要注意的是:在拷贝前都要进行初始化,防止其成为野指针。
在析构之前先将哨兵位头结点前的结点进行释放,因此就有了clear()函数,最后在析构时就只需将头结点释放。

2.3 迭代器结构

template<class T, class Ref, class Ptr>struct list_iterator{typedef list_iterator<T,Ref,Ptr> iterator;typedef list_node<T> Node;//申请一个结点指针Node* _node;//构造list_iterator(Node* node):_node(node){}};

list迭代器的本质就是一个指向结点的指针。先是申请结点指针,进行初始化,使其指向传过来的结点指针。

三,部分重要接口的作用及其实现

3.1 迭代器相关的接口

bool operator !=(const iterator& it)const{return _node != it._node;}bool operator == (const iterator& it)const{return _node == it._node;}Ref operator *(){return _node->data;}Ptr operator->(){return &(operator*());}iterator& operator++(){_node = _node->next;return *this;}iterator operator++(int){iterator tmp = *this;_node = _node->next;return tmp;}iterator& operator--(){_node = _node->prev;return *this;}iterator operator--(int){iterator tmp = *this;_node = _node->prev;return tmp;}

因为list迭代器是自定义类型,因此迭代器之间的一些操作,我们就必须要进行函数重载。我们解释几个比较重要的函数重载 。

   Ptr operator->(){return &(operator*());}

此重载所适合的环境:当list中存储的也是一个结构体是,此运算符就能够使用。
例:

struct pos{int a;int b;};list<pos> lt;list<pos>::iterator it=lt.begin();it->a;

在此函数内部,返回了&(operator*()),而operator*()我们也进行了重载,返回的是结点数据–data,要是按此形式,那么此函数最终返回的就是data的地址。这与我们上述it->a不符合。原因在于,此处还有个隐藏的->,其最终形式为:it->data->a;这是编译器为了语法的可读性,而进行的的特殊处理。
在这里插入图片描述

说完->重载,我们在来说说++的重载。

iterator& operator++()//前置++{_node = _node->next;return *this;}

由于list的空间是不连续的,因此迭代器++,就是到下一结点。

3.2 list相关接口

inert的实现

iterator insert(iterator pos,const T& val){Node* cur = pos._node;Node* newnode = new Node(val);Node* prev = cur->prev;prev->next = newnode;newnode->prev = prev;newnode->next = cur;cur->prev = newnode;return iterator(newnode);}

在这里插入图片描述
在这里插入图片描述
erase的实现

iterator erase(iterator pos){assert(pos != end());Node* cur = pos._node;Node* prev = cur->prev;Node* next = cur->next;prev->next = next;next->prev = prev;delete cur;return iterator(next);}

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

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

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

相关文章

【微信小程序】实现折叠功能,折叠不同的列表

要实现微信小程序中的折叠功能&#xff0c;可以使用wx:if或hidden属性来控制列表的显示与隐藏。同时&#xff0c;可以使用icon组件来添加指示箭头。 首先&#xff0c;在wxml文件中创建两个List列表&#xff0c;使用一个变量来控制列表的显示与隐藏&#xff1a; <view>&…

【VCS】(5)Fast RTL-level Verification

Fast RTL-level Verification General Coding GuidlinesLab --- simprofile$display() 输出彩色内容 前面的内容都是在说怎样进行仿真和验证&#xff0c;即如何使用 VCS 。 但是&#xff0c;仿真和验证是不是也有所讲究&#xff1f; 有没有一些标准来衡量设计代码和验证代码的质…

62. 不同路径

题目链接&#xff1a;力扣 解法一&#xff1a;动态规划 定义状态&#xff1a;对于m*n的网络&#xff0c;从最后一行到右下角&#xff0c;以及从最后一列到右下角&#xff0c;都只有一条不同路径&#xff1a;一直向右或一直向下&#xff0c;所以可以定义状态&#xff1a;dp[i][…

OpenCV系列__chapter2

这里写目录标题 1 图像加减乘除位运算1.1 加法 img cv2.add(img1, img2)1.2 减法 img cv2.subtract(img1, img2)1.3 乘法 img cv2.multiply(img1, img2)1.4 除法 img cv2.divide(img1, img2)1.5 位运算 2 图像增强2.1 线性变换2.2 非线性变换 3 图像几何变换3.1 裁剪、放大…

Java设计模式之单例模式(Singleton)模式

单例模式&#xff08;Singleton&#xff09;确保一个类只有一个实例&#xff0c;且提供一个全局访问点。 什么是单例模式 单例模式是一种非常常用的设计模式&#xff0c;它可以确保一个类只有一个实例&#xff0c;并且提供一个全局访问点。在单例模式中&#xff0c;应用程序中…

java(springboot)对接elasticsearch8+

1、pom引用 注&#xff1a;jackson包es只用到了databind&#xff0c;之所以全部引用是因为actuator用到了其他&#xff0c;只升级一个会 导致版本冲突 <!-- https://mvnrepository.com/artifact/co.elastic.clients/elasticsearch-java --> <dependency><grou…

七大排序算法和计数排序

文章目录 一、直接插入排序二、希尔排序三、直接选择排序四、堆排序五、冒泡排序六、快速排序6.1递归实现快速排序6.2非递归实现快速排序 七、归并排序7.1递归实现归并排序7.2非递归实现归并排序 八、计数排序 以下排序以从小到大排序为例 一、直接插入排序 时间复杂度&#x…

文章审核之敏感词过滤

技术选型 DFA实现原理 DFA全称为&#xff1a;Deterministic Finite Automaton,即确定有穷自动机。 存储&#xff1a;一次性的把所有的敏感词存储到了多个map中&#xff0c;就是下图表示这种结构 敏感词&#xff1a;冰毒、大麻、大坏蛋 工具类 最下面的main方法是测试用的&a…

Java版本电子招标采购系统源代码—企业战略布局下的采购寻源

智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c;可…

微信小程序-地图上的图标计算旋转值朝向经纬度计算

废话不多说&#xff0c;开整 // 参数为寄件人经纬度和收件人经纬度 // 根据寄收件人经纬度弧度π进行rotate旋转计算 const getRotate (po1, po2) > {if (!(po1 && po2)) return 0const lng_a po1.longitudeconst lat_a po1.latitudeconst lng_b po2.longitud…

MySQL使用

目录 1 MySQL的登录 1.1 服务的启动和终止 1.2 自带客户端的登录与退出 2 MySQL演示使用 2.1 MySQL的使用演示 2.2 MySQL的编码设置 1 MySQL的登录 1.1 服务的启动和终止 MySQL安装完毕以后&#xff0c;需要启动服务器进程&#xff0c;不然客户端无法连接数据库。 在前面…

vue-cli项目中,使用webpack-bundle-analyzer进行模块分析,查看各个模块的体积,方便后期代码优化

一、安装 npm install --save-dev webpack-bundle-analyzer 二、在vue.config.js中配置 const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin plugins: [new BundleAnalyzerPlugin({analyzerMode: server,analyzerHost: 127.0.0.1,analyze…

Word2Vec实现文本识别分类

深度学习训练营之使用Word2Vec实现文本识别分类 原文链接环境介绍前言前置工作设置GPU数据查看构建数据迭代器 Word2Vec的调用生成数据批次和迭代器模型训练初始化拆分数据集并进行训练 预测 原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&…

探析国内数字孪生引擎技术现状

在数字孪生软件来发中&#xff0c;渲染引擎是一个关键点&#xff0c;国内大多数字孪生平台引擎通常使用的是自研的渲染引擎或者采用开源的渲染引擎。下面通过一些常见的渲染引擎在国内数字孪生引擎中的应用带大家了解数字孪生软件开发的方式。 自研渲染引擎&#xff1a;许多数…

HTTPS安全套接字层超文本传输协议

HTTPS安全套接字层超文本传输协议 HTTPS简介HTTPS和HTTP的主要区别客户端在使用HTTPS方式与Web服务器通信时的步骤SSL/TLS协议的加密&#xff08;握手&#xff09;过程为什么数据传输阶段使用对称加密HTTPS 的优点HTTPS 的缺点HTTPS 的优化证书优化会话复用 HTTPS简介 HTTP协议…

文件包含漏洞利用思路

简介 通过PHP函数引入文件时&#xff0c;传入的文件名没有经过合理的验证&#xff0c;从而操作了预想之外的文件&#xff0c;导致意外的文件泄漏甚至恶意代码注入。 常见的文件包含函数 php中常见的文件包含函数有以下四种&#xff1a; include()require()include_once()re…

海外服务器推荐:国外高性能服务器免费

对于寻找高性能的海外服务器&#xff0c;海外服务器推荐指导&#xff0c;我建议您考虑以下因素&#xff1a; 1. 可靠性和性能&#xff1a;选择信誉良好、可靠性好的服务器提供商。它们应该有稳定的网络基础设施和高性能的服务器硬件来满足您的需求。 2. 位置选择&#xff1a;…

苍穹外卖day05——Redis(被病毒入侵)+店铺营业状态设置

Redis被病毒入侵了 数据删光光然后只剩这四个玩意&#xff0c;乱下东西乱删东西&#xff0c;还好是docker部署&#xff0c;不然就寄了。 在服务器上部署redis记得一定要设置密码&#xff0c;不然被人扫肉鸡注入病毒整个服务器给你崩掉。 使用配置类的方式搭建相关程序 配置数…

医生出国访问交流,为什么要趁早申请访问学者?

在当前国内&#xff0c;有这样一类医生群体&#xff0c;他们四十岁上下&#xff0c;就职于国内大型三甲医院&#xff0c;受过良好教育&#xff0c;事业辉煌&#xff0c;属于是别人眼中的精英阶层&#xff0c;然而&#xff0c;随着岁月的沉淀&#xff0c;副高级别医生群体的人生…

实现简单Spring基于XML的配置程序

定义一个容器&#xff0c;使用ConcurrentHashMap 做为单例对象的容器 先解析beans.xml得到第一个bean对象的信息&#xff0c;id&#xff0c;class&#xff0c;属性和属性值使用反射生成对象&#xff0c;并赋值将创建好的bean对象放入到singletonObjects集合中提供getBean(id)方…