list的使用及其相关知识点

news2024/9/20 20:26:39

目录

  ◉list的底层逻辑

  ◉关于list的新增功能

  ▲splice功能

  ▲remove函数

  ▲unique函数

 ▲merge函数

  ▲sort函数

  ▣迭代器类型

  ▲reverse函数

  作为数据容器之一的list和其他容器的使用上有很多相似的地方,比如都有大致相同的构造函数,大致相同的头插尾插,头删尾删函数。因此对于重复的内容我们就不在赘述,直接介绍关于list和其他数据结构容器不相同的使用方法。

  list的底层逻辑

  我们的list底层是使用带头双向循环链表实现的。所以list具有链表的特征——在插入数据的时候不需要进行数据的移动,效率很高。同时由于是带头双向循环链表。所以我们还可以通过只想尾节点的指针快速的找到最后一个节点的指针大大的提高了效率。

  由于我们的list是链表的结构。链表并不支持随机读取,如果使用随机读取的话,程序的运行效率会大大降低,所以设计者为了避免大家犯这种错误,没有提供[ ]运算符重载的接口。所以我们在想要遍历链表的时候只能使用迭代器。

  但是在使用迭代器的时候,还有很多需要注意的事项:由于我们的链表每一个元素所存储的位置并不连续所以我们的list同样没有支持+/-等函数接口。如果想要使用迭代器进行list对象的查找,我们只能通过对迭代器进行++操作进行。或者直接使用范围for(实际上也是迭代器)

  同时还需要我们注意一点:由于我们的链表不是顺序存储,所以我们的循环判断条件不能是tmp<l1.end() 而应该是不等于!!!

  关于list的新增功能

  splice功能

  splice函数的作用是将另外链表上的节点截取下来链接到该链表的指定位置上面。同样的我们也可以使用该函数取下本链表上的节点,重新链接到指定的位置达到我们的预期效果。使用方式如下:

  remove函数

  

  该功能仅仅是删除链表当中等于某一个值的节点,我们直接使用即可。

  unique函数

  该函数的作用是去除链表当中重复的数据,但是在使用的时候我们需要注意:该函数只能对有序的链表执行去重操作,因此我们必须先对链表进行排序操作。

  

  我们会发现第一遍去重操作并没有成功,因此我们需要注意在去重之前一定要保证链表当中的元素有序。

  merge函数

  该函数的作用是将两个链表进行归并产生一个新的有序的链表。同样的我们在使用该函数之前需要保证我们的链表当中的数据是有序的。

  函数的第二个参数是一个比较器,我们可以手动编写一个比较函数规定归并的方式。

  sort函数

  

  该函数的作用是对链表当中的数据进行排序。相信大家看到这个函数的时候都会想到另外一个sort函数。没错,就是我们algorithm库当中提供的sort函数。那么这两个排序函数有什么区别呢?

  我们来进行比较:

  仔细观察我们会发现,库函数当中的sort参数是一个一个的迭代器。并且类型都是自定义出来的Random迭代器。那么这个有没有什么讲究呢?我们的list能不能通过迭代器进行排序呢?

  我们会发现在尝试使用迭代器进行sort排序的时候出现了系统报错。这是因为我们的迭代器的类型不匹配。

  查找文档我们可以发现list的迭代器类型是bidirectional。该迭代器是一个双向的迭代器。

  迭代器类型

  这个时候就要向大家介绍我们数据结构当中所使用到的迭代器的类型了。在我们的数据结构当中一共存在三种迭代器种类。一种是单向迭代器,一种是双向迭代器,一种是随机迭代器。

  其中单项迭代器主要由单链表等数据结构进行使用,双向迭代器主要由list和deque等数据结构进行使用,随机迭代器主要由vector和string等数据结构进行使用,对于不同的迭代器使用的场景以及功能也是不同的。

  对于单向迭代器我们只允许进行++操作,对于双向迭代器我们允许进行++/--操作,对于随机迭代器我们允许++/--/+/-操作。

vector的迭代器类型:random iterator

list的迭代器类型:bidirectional iterator

  forward_list的迭代器类型:forward iterator

    这就是我们的list不能使用系统库当中的sort的原因。

   但是我们不能过分依赖于list当中的sort函数。list当中的sort函数仅仅是为了给我们提供方便而已。对于小规模数据的处理还可以,但是对于大规模的数据,由于容器的特性的原因效率很低。所以我们还是推荐使用vector进行数据的排序操作。

  reverse函数

  

  该函数的作用就是将链表当中的数据进行逆置操作。同样的,我们的系统std库当中也拥有相同功能的reverse函数。

  我们会发现该函数的迭代器类型是一个双向迭代器,因此可以正常使用。

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

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

相关文章

CUDA编程之CUDA Sample-5_Domain_Specific-volumeFiltering(光线追踪)

volumeFiltering演示了使用 3D 纹理和 3D 表面写入进行 3D 体积过滤。它从磁盘加载一个 3D 体积&#xff0c;并使用光线步进和 3D 纹理进行显示。 以下是该示例的主要内容和功能&#xff1a; 主要功能 3D 体积加载: 从磁盘加载 3D 体积数据&#xff0c;通常为医学成像数据或体…

图像处理中的腐蚀与膨胀算法详解

引言 在图像处理领域&#xff0c;形态学操作&#xff08;Morphological Operations&#xff09;是处理二值图像的重要工具。腐蚀&#xff08;Erosion&#xff09;和膨胀&#xff08;Dilation&#xff09;是形态学操作的两种基本形式&#xff0c;它们常用于消除噪声、分割图像、…

深入解析C#中的锁机制:`lock(this)`、`lock(privateObj)`与`lock(staticObj)`的区别

前言 在C#的多线程编程中&#xff0c;lock关键字是确保线程安全的重要工具。它通过锁定特定的对象&#xff0c;防止多个线程同时访问同一块代码&#xff0c;从而避免数据竞争和资源冲突。然而&#xff0c;选择适当的锁对象对于实现高效的线程同步至关重要。本文将深入探讨使用…

三种tcp并发服务器实现程序

都需先进行tcp连接 1、多进程并发 2、多线程并发 3、IO多路复用并发 &#xff08;1&#xff09;select &#xff08;2&#xff09;epoll

在VB.net中,LINQ在数据统计方面的应用,举例说明

标题 在VB.net中&#xff0c;LINQ在数据统计方面的应用&#xff0c;举例说明 正文 在VB.NET中&#xff0c;LINQ&#xff08;Language Integrated Query&#xff09;在数据统计方面有着广泛的应用。LINQ允许开发者以声明性的方式对数据集合进行复杂的查询和统计操作&#xff0c;…

笔记:Echarts 饼图 图例legend 自定义 换行

配置后效果&#xff1a;&#x1f447; 配置&#xff1a; let option {legend: [{data: ["融云", "融AI", "融安全", "融平台"],show: true,right: "3%",bottom: "20%",left: "center",icon: "re…

乾元通渠道商中标大理市自然灾害应急能力提升项目

近日&#xff0c;乾元通渠道商中标云南省大理市自然灾害应急能力提升项目&#xff0c;乾元通作为设备厂家&#xff0c;为项目提供通信指挥类装备&#xff08;多链路聚合设备&#xff09;QYT-X1。 青岛乾元通数码科技有限公司作为国家应急产业企业&#xff0c;深耕于数据调度算法…

医疗数字化转型数据中台架构方案(一)

为推进医疗数字化转型&#xff0c;我们提出构建数据中台架构方案&#xff1a;通过集成医院内外多个数据源&#xff0c;利用大数据、人工智能等技术对数据进行清洗、整合、标准化处理&#xff0c;形成高质量的数据资产&#xff1b;再基于云原生技术构建湖仓一体化大数据平台&…

【Python数据结构与算法】栈----合法出栈序列

题目&#xff1a;合法出栈序列 描述 给定一个由大小写字母和数字构成的&#xff0c;没有重复字符的长度不超过62的字符串x&#xff0c;现在要将该字符串的字符依次压入栈中&#xff0c;然后再全部弹出。 要求左边的字符一定比右边的字符先入栈&#xff0c;出栈顺序无要求。 …

守护夏日清凉:EasyCVR+AI视频智能管理方案为水上乐园安全保驾护航

随着夏季的来临&#xff0c;水上乐园成为了人们避暑消夏、亲子互动的理想去处。然而&#xff0c;随着游客量的激增&#xff0c;如何确保水上乐园的安全与秩序&#xff0c;提升游客体验&#xff0c;成为了管理者亟待解决的问题。为此&#xff0c;引入一套高效、智能的视频监控方…

Node.js原生开发脚手架工具(下)

前言 在现代软件开发中&#xff0c;脚手架工具成为提高开发效率和一致性的关键利器。使用Node.js原生开发自己的脚手架工具不仅能帮助自动化常见任务&#xff0c;还能根据具体需求进行高度定制。Node.js的异步非阻塞特性和丰富的模块系统使其成为构建这种工具的理想选择。本篇文…

使用 pnpm workspace 和 standalone 模式构建 Next.js 的 Docker 镜像

引言 本文将探讨如何利用 pnpm workspace 和 standalone 模式来构建 Next.js 应用程序的轻量级 Docker 镜像。这种方法通过仅在 node_modules 目录中包含必要的文件&#xff0c;显著减少了最终 Docker 镜像的大小。 Standalone 模式简介 通常情况下&#xff0c;所有在 depe…

MyPrint打印设计器(四)vue3 函数式调用组件

vue3 函数式调用组件 vue中&#xff0c;通常情况下调用一个组件需要以下步骤 导入组件在template引入组件&#xff0c;并且设置ref属性在js模块定义对应的ref属性通过ref对象调用对应的方法 如果这个组件在template是不必要的&#xff0c;那么可以通过函数式调用组件&#xff…

Windows 10/11 系统优化工具 Optimizer 16.7

Optimizer 功能特色 全语言支持&#xff08;提供19种语言&#xff09; 提高系统和网络性能 禁用不必要的窗口服务 禁用 Windows 遥测、小娜等 禁用 Office 遥测&#xff08;仅适用于 Office 2016&#xff09; 禁用 Windows 10 自动更新 一次快速下载有用的应用程序 卸载 UWP 应…

ARMxy工业控制器搭载 Mini PCIe加密安全芯片工业控制拓展之旅

在当今高度数字化和智能化的工业领域&#xff0c;数据采集的准确性、实时性和全面性对于优化生产流程、提高产品质量以及保障生产安全至关重要。ARM 工业控制器以其高效能、低功耗和出色的稳定性&#xff0c;成为了工业自动化领域的重要组成部分。而其中的 Mini PCIe 接口更是为…

JVM内存结构、内存参数、调优原理

文章目录 引言I JVM基础知识1.1 JVM内存区域1.2 JVM 堆内存布局1.3 JVM 内存参数II 调整JVM的默认堆内存配置2.1 java命令启动jar包时配置JVM 的内存参数2.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数III JVM调优基本概念: 应用程序的响应时间(RT)和吞吐量(QPS)…

基于springboot+vue+uniapp的使命召唤游戏助手小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

Lenze伦茨E82ZAFSC / E82ZAFSC001变频器IO模块手测

Lenze伦茨E82ZAFSC / E82ZAFSC001变频器IO模块手测

easyExcel 单元格合并

需求 现在有一张员工表&#xff0c;需要将员工信息导出为excel&#xff0c;同一个部门放在一起&#xff0c;同一个工资段放在一起。 case 员工表 package com.tx.test.testeasyexcel.excel;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.anno…

人工智能开发实战TensorFlow机器学习框架解析

内容导读 TensorFlow概述 TensorFlow环境搭建 TensorFlow计算机加速 一、TensorFlow概述 1、TensorFlow简介 ‌‌TensorFlow是由‌Google开发的用于‌机器学习和人工智能的开源软件库&#xff0c;特别适用于‌深度神经网络的训练和推理。‌ 它是一个基于‌数据流图的符号…