【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;}
};

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

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

相关文章

[力扣题解] 151. 反转字符串中的单词

题目&#xff1a;151. 反转字符串中的单词 思路 代码 Method 1&#xff0c;Me class Solution { public:string reverseWords(string s) {int i, start;// Step 1for(i 0; i < s.size() - 1; i){if(s[i] && s[i 1] ){s.erase(i 1, 1);i--;}}// Step 2if…

统计信号处理基础 习题解答10-5

题目 通过令 并进行计算来重新推导MMSE估计量。提示&#xff1a;利用结果 解答 首先需要明确的是&#xff1a; 上式是关于观测值x 的函数 其次需要说明一下这个结果 和教材一样&#xff0c;我们用求期望&#xff0c;需要注意的是&#xff0c;在贝叶斯情况下&#xff0c;是个…

创刊即王炸?首个IF近7分,稳坐中科院1区!同领域全球第一!

【欧亚科睿学术】 01 期刊基本概况 【期刊类型】经济类SSCI 【出版社】SPRINGER出版社 【期刊概况】IF&#xff1a;8.0-9.0&#xff0c;JCR1区&#xff0c;中科院1区 【版面类型】正刊&#xff0c;仅少量版面 【预警情况】2020-2024年无预警记录 【收录年份】2016年被WO…

C语言| 三个整数从小到大排序

【分析思路】 三个整数从小到大排序 这个程序的算法是&#xff1a; 先把第一个数num1跟它后面所有的数相比较&#xff0c;找出最小的&#xff0c;通过中间变量temp交换,赋给num1&#xff1b; 接着中间值num2和它后面所有的数相比较&#xff0c;找出第二小的&#xff0c;然后赋给…

Facebook开户|Facebook做落地页的标准和建议

哈喽呀家人们下午好~今天Zoey来跟大家带来Facebook做落地页的标准和建议&#xff01;需要的家人建议点赞收藏啦&#xff01;&#xff01;用户通过点击你的推广链接、搜索引擎搜索结果页面的快照链接、社交媒体中的网页链接、电子邮件中的链接等进入你网站的特定页面&#xff0c…

tcp链接中的三次挥手是什么原因

一、tcp链接中的正常四次挥手过程&#xff1f; 刚开始双方都处于 ESTABLISHED 状态&#xff0c;假如是客户端先发起关闭请求。四次挥手的过程如下&#xff1a; 1、客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&#xff0c;也即 FIN 报文…

pytorch项目实战-分类模型李宏毅 21 机器学习第三次作业代码详解 CNN图片分类任务

CNN 卷积神经网络食物分类任务 前言一、数据集介绍二、CNN模型整体框架三、卷积神经网络代码详解3.1 导入需要使用的包3.2 数据集&#xff0c;数据加载器&#xff0c;数据增强操作3.2.1 数据增强3.2.2 数据集构建3.2.3 加载器构建 3.3 卷积神经网络构建3.4 训练代码3.4.1 半监督…

jmeter多用户登录并退出教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录并退出操作&#xff0c;大致参考如下 多用户登录前面已经实现&#xff1a;参考博文 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、多用户退出操作 添加一个setUp线程组&#xff0…

Perplexity 搜索引擎刚刚推出了新的页面功能——维基百科可以扔了

Perplexity 允许用户根据搜索结果创建自定义页面 人工智能搜索引擎初创公司 Perplexity 推出了一项新功能&#xff0c;使其结果更具粘性&#xff0c;允许用户将研究转变为易于共享的页面。页面建立在 Perplexity 中现有的人工智能驱动的搜索功能之上&#xff0c;该功能使用与 …

PLC编程自动与手动:深入探索两者的本质差异与潜在挑战

PLC编程自动与手动&#xff1a;深入探索两者的本质差异与潜在挑战 在工业自动化领域中&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;编程的自动与手动模式如同两个截然不同的世界&#xff0c;既相互交织又各具特色。这两种模式不仅在功能实现上有所区别&#xff0…

云服务(ECS)Docker安装vulhub安装详解

本文以xshell进行远程控制 1.以ssh连接云服务器 ssh 服务器名公网ip [D:\~]$ ssh root47.99.138.9 在弹框中输入密码 2.安装docker curl -s http://get.docker.com/ | sh rootiZbp1fm14idjlfp53akni8Z:~# curl -s https://get.docker.com/ | sh # Executing docker insta…

使用Lua基本实现分布式锁并自动续期

分布式锁的成熟方案很多,比如redission、zookeeper…… package com.cdn.redission.controller;import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation

php自学【笔记一】结合实战-读代码 学知识

<?php// [ 应用入口文件 ] namespace think;if(version_compare(PHP_VERSION,7.2.0,<)) {die(HkCms开源内容管理系统要求PHP版本 > 7.2.0&#xff0c;当前PHP版本为&#xff1a;.PHP_VERSION.&#xff0c;请更换PHP版本后再试&#xff01;); }if (file_exists(__DIR_…

万字长文,小白新手怎么开始做YOLO实验,从零开始教!整体思路在这里,科研指南针!

最近专栏来了很多的新手小白&#xff0c;对科研实验的过程感到困惑和无从下手&#xff0c;这篇文章就来讲解一下整体的科研流程&#xff0c;从选择数据集到发表论文的各个步骤&#xff0c;并针对大家在实验中常犯的错误进行解答。并且为大家提供通向我其他相关博客的指引&#…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器&#xff0c;以下是对其的详细介绍&#xff1a; 1. 定义与别称&#xff1a; 激光焊接机&#xff0c;又常称为激光焊机、镭射焊机&#xff0c;是材料加工激光焊接时用的机器。 2. 工作原理&#xff1a; 激光焊接是利用高能量…

【面试】Java的前端编译器和后端编译器

目录 1. 说明2. 前端编译器2.1 主要功能2.2 工作原理 3. 后端编译器3.1 主要功能3.2 工作原理 1. 说明 1.在Java的编译过程中&#xff0c;编译器通常被划分为前端编译器和后端编译器&#xff0c;各自负责不同的任务。2.前端编译器主要负责源代码的词法分析、语法分析和语义检查…

【计算机毕业设计】345大学生心理健康测评管理系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Sass它是什么?有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

Sass是一种强大的CSS预处理器&#xff0c;通过增加一些额外的功能和语法&#xff0c;使得CSS代码更加模块化、可维护和易于编写。 Sass具有以下特点&#xff1a; 1. 变量&#xff1a;可以定义变量来存储颜色、字体大小、间距等属性值&#xff0c;以便在整个样式表中重复使用。…

【数据结构与算法 | 二叉树篇】二叉树的前中后序遍历(递归版本)

1. 二叉树的概念 (1). 二叉树的结构 借用了一下力扣的模板 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.righ…

Linux下的Git应用

1、卸载 2、安装 3、创建并初始化 4、配置 &#xff08;附加删除语句&#xff09; 5、查看&#xff08;tree .git/&#xff09; 6、增加和提交 7、打印日志 8、验证已操作工作