C++ STL- list 的使用以及练习

news2024/11/16 0:28:10

目录

0.引言

1. list 介绍 

2. list 使用

2.1 构造函数

2.2 list iterator 的使用 

3 list capacity 

4. list element access 

5. list modifiers 

6. list 迭代器失效 

7. list 与vector 对vector

8. OJ 题讲解 

删除链表的倒数第 N  个节点:


0.引言

本篇博客我们将介绍 STL 中 list 的使用,由于list STL 接口函数与之前vector string 类似,我们在这里将不再详细赘述了,通过 OJ 题来练习 list 的实际使用。

1. list 介绍 

(1). list是可以在常数范围内在任意位置进行插入和删除的序列式容器,该容器可以前后双向迭代。

(2). list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。

(3). list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。

(4). 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

(5). 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)。

2. list 使用

2.1 构造函数

构造函数:constructor说明
list (size_type n, const value_type& val = value_type()) 构造的list中包含n个值为val的元素
list() 构造空的list
list (const list& x) 拷贝构造函数
list (InputIterator first, InputIterator last) 用[first, last)区间中的元素构造list

2.2 list iterator 的使用 

函数声明说明
begin() + end()返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin() + rend()返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的 reverse_iterator,即begin位置

 这里可以将将迭代器理解成一个指针,该指针指向list中的某个节点。

(1).  begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动

(2).  rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

3 list capacity 

函数声明说明
empty检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数

4. list element access 

函数声明说明
front返回list的第一个节点中值的引用
back返回list的最后一个节点中值的引用

5. list modifiers 

函数声明说明
push_front在list首元素前插入值为val的元素
pop_front删除list中第一个元素
push_back在list尾部插入值为val的元素
pop_back删除list中最后一个元素
insert在list position 位置中插入值为val的元素
erase删除list position位置的元素
swap交换两个list中的元素
clear清空list中的有效元素

6. list 迭代器失效 

迭代器失效即迭代器所指向的节点的无效,即该节 点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代 器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

int Array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
list<int> l(Array, Array + sizeof(Array) / sizeof(int));

auto it = l.begin();
while (it != l.end())
{
	// erase()接口被执行后,it所指向的节点已被删除,导致it迭代器无效,在下一次使用时,必须重新赋值
	l.erase(it);
	++it;
}

 

正确写法: 

int Array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
list<int> l(Array, Array + sizeof(Array) / sizeof(int));

auto It = l.begin();
while (It != l.end())
{
	// erase()接口被执行后,对It重新赋值
	l.erase(It++); // It = l.erase(It) -- 后置++先使用后自增
}

7. list 与vector 对vector

vectorlist
底层结构动态顺序表,一段连续空间 带头结点的双向循环链表
随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素 效率O(N)
插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂 度为O(N),插入时有可能需要增容,增容:开辟新空 间,拷贝元素,释放旧空间,导致效率更低 任意位置插入和删除效率高,不 需要搬移元素,时间复杂度为 O(1)
空间利用率底层为连续空间,不容易造成内存碎片,空间利用率 高,缓存利用率高 底层节点动态开辟,小节点容易 造成内存碎片,空间利用率低, 缓存利用率低
迭代器原生态指针 对原生态指针(节点指针)进行封装
迭代器失效在插入元素时,要给所有的迭代器重新赋值,因为插入 元素有可能会导致重新扩容,致使原来迭代器失效,删 除时,当前迭代器需要重新赋值否则会失效 插入元素不会导致迭代器失效, 删除元素时,只会导致当前迭代 器失效,其他迭代器不受影响
使用场景需要高效存储,支持随机访问,不关心插入删除效率 大量插入和删除操作,不关心随 机访问

8. OJ 题讲解 

删除链表的倒数第 N  个节点:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 

 我们以示例为例来做分析,为完成题目要求,我们只需要将 3 指向 5 即可。

那么我们如何确定倒数第 n 个 节点的位置呢? 我i们只需要定义两个快慢指针,让快指针先走 n 步,然后再让快慢指针同时走,当快指针走到最后的一个节点时,那么慢指针指向的位置即为倒数第 n-1 个位置,刚好方便删除操作,最后为了方便返回头节点,我们可以提前开辟一个哨兵位,哨兵位指向头节点即可。

 

接着我们来看代码: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) 
    {
         ListNode* sentinel = new ListNode(0);  
         sentinel->next = head;
         ListNode* slow = sentinel;
         ListNode* fast = sentinel;
         while(n--)
            fast = fast->next;

         while(fast->next)
         {
            fast = fast->next;
            slow = slow->next;
         }
         slow->next = slow->next->next;

         return sentinel->next;  
    }
};

复杂度分析: 

快慢指针实则只遍历一次,时间复杂度 O(n), 只申请了有几个变量,空间复杂度 O(1) 。

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

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

相关文章

绿盟《安全知识图谱技术白皮书》.PDF

共82页&#xff0c;包含网络安全智能化发展趋势、安全知识图谱技术框架、安全知识图谱关键技术、安全知识图谱典型应用场景、安全知识图谱技术发展趋势等。 由于篇幅限制&#xff0c;仅展示部分内容 完整版图谱PDF&#xff0c;请关公号【网络安全实战】&#xff0c;后台发送“…

考研数学一——概率论真题——自我总结题型整理(总分393)

系列文章目录 终于考完研了&#xff0c;本人考的是南京航空航天大学的仪器科学与技术&#xff0c;英一数一电路&#xff0c;以下是成绩单&#xff1a; 平时习惯整理自己的学习体系&#xff0c;以下是一个记录。 其实&#xff0c;每个人都应该训练&#xff0c;看到某一类题目…

Vue2手搓级联组件

本文的布局才用了叶落风尘大佬的一片文章&#xff0c;功能是自己加的 源代码 页面部分 <div class"h-100vh grid place-items-center"><div><div class"h-455px flex flex-col border-1px border-solid border-#eee w-885px"><div cl…

洁净环境监测相关法规指南汇总

一 洁净级别确认 1. 用于生产无菌药品的洁净室和洁净空气设备如单向流系统&#xff08;UDAF&#xff09;、限制进入屏障系统&#xff08;RABS&#xff09;和隔离器&#xff0c;应根据所需环境特性进行确认。生产操作需要在适当洁净度级别的环境中进行&#xff0c;以降低粒子或…

【漏洞复现】通天星CMSV6-inspect_file-upload文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Android实现一周时间早中晚排班表

我们要做一个可以动态添加,修改一周早中晚时间排班表&#xff0c;需求图如下&#xff1a; one two 过程具体在这里不描述了&#xff0c;具体查看&#xff0c;https://github.com/yangxiansheng123/WorkingSchedule 上传数据格式&#xff1a; {"friday_plan":"…

个人周总结

个人周总结&#xff1a; 对于总体方向目标的完成&#xff0c;完成的不是很好&#xff0c;这周内的很多天都在游离&#xff0c;就是事情可能有需要做的&#xff0c;但是动力不很足&#xff0c;期间就是有点摆烂了。后面及时调整调整吧&#xff0c;有这种情况&#xff0c;一个原…

无人驾驶(移动机器人)路径规划之A star(Tie Breaker)算法及其matlab实现

在自动驾驶与移动机器人路径规划时&#xff0c;必定会用到经典的算法A star。下面是我未加入与加入Tie Breaker 的matlab实现效果。可以发现加入Tie Breaker之后效果明显改善。 目录 一、效果比较 1.未加入Tie Breaker&#xff08;黑色为障碍物&#xff0c;菱形绿色为目标点…

婴儿洗衣机有必要买吗?四大满分婴儿洗衣机入围榜单

宝宝衣服的清洗对父母来说都很重要&#xff0c;所以挑选一款适合宝宝的波轮洗衣机显得尤为重要。也许有许多人认为&#xff0c;为婴儿购买独立的洗衣机是不必要的&#xff0c;但是你是否了解呢&#xff1f;新生婴儿的肌肤要比成人更脆弱&#xff0c;更易受到感染而受到伤害&…

vue3.0 + ts + eslint报错:error Parsing error: ‘>‘ expected

eslint报错 这里加上对应的 eslint配置即可&#xff1a; parser: vue-eslint-parser, parserOptions: {parser: "typescript-eslint/parser",ecmaVersion: 2020,sourceType: module, }具体如下&#xff1a; module.exports {parser: vue-eslint-parser,parserOpti…

浏览器输入框自动填充默认样式移除

文章目录 浏览器输入框自动填充默认样式移除问题现象以及探索过程尝试代码有效关键代码&#xff08;解决方案&#xff09; 浏览器输入框自动填充默认样式移除 问题现象以及探索过程 &#xff08;在 uniapp 语法下&#xff09;本文的写法在 Edge 119.0.2151.58 (正式版本) (64 …

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-乘积尾零

solution 找末尾0的个数&#xff0c;即找有多少对2和5 >问题等价于寻找所给数据中&#xff0c;有多少个2和5的因子&#xff0c;较少出现的因子次数即为0的个数 #include <iostream> using namespace std; int main() {// 请在此输入您的代码printf("31");…

docker配置镜像加速后容器和镜像消失

一、问题描述 根据阿里云给docker配置镜像加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://gt6j98xi.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl rest…

大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望---打造AI应用新篇章

大模型落地实战指南&#xff1a;从选择到训练&#xff0c;深度解析显卡选型、模型训练技、模型选择巧及AI未来展望—打造AI应用新篇章 0.前言大模型发展史 早期阶段&#xff08;1950s~1980s&#xff09; 在1950年代初期&#xff0c;人们开始尝试使用计算机处理自然语言文本。…

C语言:给结构体取别名的4种方法

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到typedef这个关键字&#xff0c;这个关键字的作用是给现有的类型取别名&#xff0c;在实际使用过程中往往是将一个复杂的类型名取一个简单的名字&#xff0c;便于我们的使用。就像我们给很熟的人取外号一样&#xff…

对标开源3D建模软件blender,基于web提供元宇宙3D建模能力的dtns.network德塔世界是否更胜一筹?

对标开源3D建模软件blender&#xff0c;基于web提供元宇宙3D建模能力的dtns.network德塔世界是否更胜一筹&#xff1f; blender是一款优秀的3D建模开源软件&#xff0c;拥有免费开源、功能强大、渲染速度优秀的优点。而开源的dtns.network德塔世界&#xff0c;亦是专业级的元宇…

计算机网络——27路由选择算法

路由选择算法 路由协议 路由协议的目标&#xff1a;确定从发送主机到接收主机之间&#xff0c;通过路由器的网络“较好”的路径&#xff08;等价于路由器的序列&#xff09; 路径&#xff1a;路由器的序列&#xff0c;分组将会沿着该序列从源主机到达最后的目标主机“较好”…

vue 中实现下载后端返回的流式数据

验证是否是blob /*** Event 验证是否为blob格式* */export async function blobValidate(data) {try {const text await data.text();JSON.parse(text);return false;} catch (error) {return true;}}get请求 /*** Event: get请求下载后端返回的数据流* description: url[Stri…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图&#xff1a; 由点(node&#xff0c;或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树&#xff1a;特殊的图树&#xff0c;即连通无环图树的结点从根开始&#xff0c;层层扩展子树&#xff0c;是一种层次关系&#xff0c;这种层次关系&#xff0…

Multimodal Chain-of-Thought Reasoning in Language Models阅读笔记

论文&#xff08;2023年&#xff09;链接&#xff1a;https://arxiv.org/pdf/2302.00923.pdf GitHub项目链接&#xff1a;GitHub - amazon-science/mm-cot: Official implementation for "Multimodal Chain-of-Thought Reasoning in Language Models" (stay tuned a…