【C++】10.list

list这个迭代器是双向迭代器,与vector的迭代器具有很大的区别,主要在于双向迭代器不支持+- 操作
正由于list的双向迭代器,因此<algorithm>中的sort()函数无法使用,list单独实现了一个sort()函数,但效率极低。

一、list的介绍与使用

在这里插入图片描述

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向
    其前一个元素和后一个元素。
  3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高
    效。
  4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
  5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list
    的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间
    开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这
    可能是一个重要的因素)
    在这里插入图片描述

二、list的模拟实现

2.1 节点类

//结点
template<class T>
struct ListNode
{
	T _data;
	ListNode<T>* _prev;
	ListNode<T>* _next;

	ListNode(const T& x=T()):_prev(nullptr),_next(nullptr),_data(x){}
};

2.2 迭代器类

由于在遍历时需要实现++的操作,但是链表并不是连续的,因此需要对结点的行为进行重新定义,就有了这个类

//迭代器
 template<class T,class ref,class ptr>
 struct ListIterator
 {
	 typedef ListNode<T> Node;
	 typedef ListIterator self;

	 Node* _node;

	 ListIterator(Node* node):_node(node){}
	 self& operator++()
	 {
		 _node = _node->_next;
		 return *this;
	 }
	 self& operator--()
	 {
		 _node = _node->_prev;
		 return *this;
	 }
	 self& operator++(int)
	 {
		 Node* temp = *this;
		 _node = _node->_next;
		 return temp;
	 }
	 self& operator--(int)
	 {
		 Node* temp = *this;
		 _node = _node->_prev;
		 return temp;
	 }
	 bool operator!=(const self&  x)
	 {
		 return _node != x._node;
	 }
	 bool operator==(const self& x)
	 {
		 return _node == x._node;
	 }
	 ref operator*()
	 {
		 return _node->_data;
	 }
	 ptr operator->()
	 {
		 return &_node->_data;
	 }
 };

2.3 list类

//链表
template<class T>
class list
{
	typedef ListNode<T> Node;
	typedef ListIterator<T,T&,T*> iterator;
	typedef ListIterator<T,const T&,const T*> const_iterator;
private:
	Node* _head;
public:
	void empty_head()
	{
		_head = new Node();
		_head->_next = _head;
		_head->_prev = _head;
	}
	list()
	{
		empty_head();
	}
	list(const list& lt)
	{
		empty_head();
		for (const auto& e : lt)
		{
			push_back(e);
		}
	}
	list(initializer_list<T> il)
	{
		empty_head();
		for (const auto& e : il)
		{
			push_back(e);
		}
	}
	list<T>& operator=(list<T> lt)
	{
		swap(_head, lt._head);
		return *this;
	}
	void clear()
	{
		auto it = begin();
		while (it != end())
		{
			it=erase(it);//连续的删除,可能造成迭代器失效
		}
	}
	~list()
	{
		clear();
		delete _head;
		_head = nullptr;
	}
	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;*/
		insert(end(), x);
	}
	void pop_back()
	{
		erase(--end());
	}
	void push_front(const T& x)
	{
		insert(begin(), x);
	}
	void pop_front()
	{
		erase(begin());
	}
	iterator begin()
	{
		return iterator(_head->_next);
	}
	iterator end()
	{
		return iterator(_head);
	}
	const_iterator begin() const
	{
		return const_iterator(_head->_next);
	}
	const_iterator end() const
	{
		return const_iterator(_head);
	}
	iterator insert(iterator pos, const T& x)
	{
		Node* cur = pos._node;
		Node* prev = cur->_prev;

		Node* newnode = new Node(x);

		newnode->_prev = prev;
		prev->_next = newnode;
		cur->_prev = newnode;
		newnode->_next = cur;
		return iterator(newnode);
	}
	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 next;
		
	}
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大豆、棉花深度学习数据集大合集

最近收集了一大波关于大豆和棉花的深度学习数据集&#xff0c;主要有叶片的识别、分类、计数以及病害检测等。 数据集的价值 科研价值&#xff1a;这些数据集为植物学、农业信息技术、机器学习等领域的科研人员提供了宝贵的资源。它们可以用于训练和优化各种深度学习模型&…

【因果推断python】7_线性回归模型1

目录 你需要的只是回归 你需要的只是回归 在处理因果推断时&#xff0c;我们看到每个人有两个潜在的结果&#xff1a; 是个体如果不接受干预的结果和 是他或她接受干预的结果。将干预变量 T 设置为 0 或 1 的行为会实现其中一个潜在结果&#xff0c;并使我们不可能知道另一个结…

3G/4G无线视频监控系统在吊车操作中的应用

引言 随着科技的快速发展&#xff0c;无线视频监控技术在多个领域得到了广泛应用。在吊车操作中&#xff0c;3G/4G无线视频监控系统以其高效、实时的特性&#xff0c;为操作人员提供了更全面的视觉信息&#xff0c;从而大大提高了操作的安全性。本文将详细介绍3G/4G无线视频监…

Python代码:二十八、密码游戏

1、题目 牛牛和牛妹一起玩密码游戏&#xff0c;牛牛作为发送方会发送一个4位数的整数给牛妹&#xff0c;牛妹接收后将对密码进行破解。 破解方案如下&#xff1a;每位数字都要加上3再除以9的余数代替该位数字&#xff0c;然后将第1位和第3位数字交换&#xff0c;第2位和第4位…

docker 启动关闭,设置仓库地址

1. 配置/etc/docker/daemon.json cat /etc/docker/daemon.json# 内容 {"registry-mirrors": ["https://0nth4654.mirror.aliyuncs.com"],"insecure-registries": ["harbor.domain.io"] }2. 配置systemd启动文件 和方法1配置会有冲突&a…

wampserver安装与汉化

wampserver安装与汉化 文章目录 wampserver安装与汉化一、安装二、汉化1.升级软件并安装补丁 介绍&#xff1a; WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。免去了开发人员将时间花费在繁琐的配置环境过程&#xff0c;从而腾出更…

Thread的stop和interrupt的区别

Thread.stop Thread.stop()方法已被废弃。 因为本质上它是不安全的&#xff0c;使用该方法可能会导致数据、资源不一致的问题&#xff0c; public class ThreadDemo {static class MyThread extends Thread {Overridepublic void run() {while (true) {try {Thread.sleep(10…

科研数据分析常见问题

许多使用SPSSAU进行初次科研数据分析的同学&#xff0c;可能对数据分析方法的深层原理和研究思路缺乏全面的把握。因此&#xff0c;当导师针对数据研究方法提出具体问题时&#xff0c;他们可能会感到些许困惑或难以立即给出满意的答复。鉴于此&#xff0c;SPSSAU汇总了一些常见…

语音助手拦截,拦截小秘书

呼叫中心业务场景下会遇到很多的语音助手和语音小秘书&#xff0c;还有一些漏话提醒、语音信箱等&#xff1b;大部分原因是由于主叫号码标记问题导致的局端和终端拦截策略&#xff0c;电话没有真实有效的触达并产生了通信费&#xff0c;这让很多业务场景下通信成本上涨据不完全…

【Springboot】——项目的创建与请求参数应用

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

<PLC><Python>基于pyqt5使用python与汇川PLC进行485串口通讯(自由协议)

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…

Python知识点12---Python的I/O操作

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的流(I/O)操作&#xff0c;最简单的其实就是输入和输出&#x…

flask-slqalchemy使用详解

目录 1、flask-sqlalchemy 1.1、flask_sqlalchemy 与sqlalchemy 的关系 1.1.1、 基本定义与用途 1.2、flask_sqlalchemy 的使用 1.2.1、安装相关的库 1.2.2、项目准备 1.2.3、创建ORM模型 1.2.3.1、使用db.create_all()创建表的示例 1.2.3.2、创建多表关联ORM模型 1.…

每日刷题——相遇、宝石(模拟+数学)、相助(模拟+数组)、相依(dp的优化)

相遇 原题链接登录—专业IT笔试面试备考平台_牛客网 题目描述 运行代码 #include<iostream> using namespace std; int main(){ int a,b; cin>>a>>b; if(ab) { cout<<"p"; } else if(a - b 1 || (a 1 && b 3)){cout <<…

【图像增强处理工具】软件使用说明书

软件使用说明书 软件名称 图像增强处理工具 软件简介 该软件是一个基于 PySide6 和 OpenCV 的图像处理工具,用户可以通过 GUI 界面来执行图像的旋转、平移和镜像操作,并将处理后的图像保存到指定路径。 运行软件须知 确保 ui_form.py 文件在同一目录下,该文件包含了通…

鸿蒙实现汉字转拼音

1.使用三方库 pinyin-pro 地址&#xff1a;OpenHarmony三方库中心仓 亲测可用&#xff0c;一共三个关于 转pinyin的库&#xff0c;一个无法使用&#xff0c;另一个时间太久。 ohpm i pinyin-proimport { pinyin } from pinyin-pro;// 获取带音调拼音 pinyin(汉语拼音); // …

11Linux学习笔记

Linux 实操篇 目录 文章目录 Linux 实操篇1.rtm包&#xff08;软件&#xff09;1.1 基本命令1.2 基本格式1.3安装rtm包1.4卸载rtm包 2.apt包2.1 基本命令结构2.2 常用选项2.3常用命令 1.rtm包&#xff08;软件&#xff09; 1.1 基本命令 1.2 基本格式 1.3安装rtm包 1.4卸载r…

webman-admin多图上传预览和删除

前言 在webmen文档和论坛中都没找到多图上传的示例&#xff0c;自己找了一个&#xff0c;整合了一下凑合用 insert页面 引入css <link rel"stylesheet" href"/app/admin/admin/css/muti-upload.css" />muti-upload.css内容如下 .uploader-list .ha…

H6922 2.8C-40V (最低启动电压2.5V)升压BOOST恒压芯片 5V12V24V升压IC

H6922升压BOOST恒压芯片是一款2.8C-40V &#xff08;最低启动电压2.5V&#xff09;升压BOOST恒压芯片 5V12V24V升压IC 首先&#xff0c;H6922的宽输入电压范围&#xff08;2.8-40V&#xff09;和低启动电压&#xff08;最低2.5V&#xff09;使其能够适应不同复杂的电源环境。无…

Java网络编程(上)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java文件IO&#x1f649; &#x1f439;今日诗词:来如春梦几多时&#xff1f;去似朝云无觅处&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&a…