【C++】STL标准库之list
STL标准库之list
- list类的简介
- 常用的list类的接口
- 构造
- 迭代器
- 容量
- 访问
- 修改
- list和vector的区别
list类的简介
list是一种序列式容器,可以在任意位置插入和删除元素,并且其时间复杂度为O(1),在底层,list是双向链表结构,每个节点通过指针指向下一个节点,因此最大的缺陷是不支持随机访问,必须从已知位置开始迭代到该位置,同时节点除了存储val值之外,还要存储指针,因此需要一些额外的空间。
由于双向带头循环链表的存在,使得list在找尾时无需从头开始遍历,这样就有效降低了查找时候的时间复杂度。(头节点不存储数据,只是记录了当前list的第一个节点的地址和最后一个节点的地址)
常用的list类的接口
构造
函数名称 | 功能 |
---|---|
list(size_type n, const value_type& val = value_type() ) | n个值为value的元素 |
list() | 空列表 |
list(const list& x) | 拷贝构造 |
list(InputIterator first, InputIterator last) | 用first和last进行区间构造 |
对应写法:
list<int> l(10, 5);
list<int> l2();
list<int> l3(l2);int arr[] = {1,2,3,4,5};
int n = sizeof(arr)/sizeof(arr[0]);
list<int> l4(arr, arr+n);
迭代器
函数名称 | 功能 |
---|---|
begin()+end() | 返回第一个元素的迭代器和最后一个元素的迭代器 |
rbegin()+rend() | 返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置 |
从迭代器的在list中的位置可以看到,begin()实际上在第一个有效节点的位置,而end()在头节点的位置,那么为何要这样设置呢?
实际上,这样设置迭代器后,就可以很快速的找到当前链表的头和尾了,当需要找尾时,使用end()指向节点中的prev就可以快速找到,如果需要判断当前列表是否为空呢,实际上直接判断end()指向的值和begin()指向的值是否相等,如果相等,意味着head节点就是当前列表中唯一的节点,那么就说明当前列表为空。
判读是否为空就可以直接判断end和begin是否相等,因为当只有一个头节点的时候,prev和next指向的都是头节点。
容量
函数名称 | 功能 |
---|---|
empty | 判断是否为空列表 |
size | 计算当前列表中有多少个有效节点 |
访问
函数名称 | 功能 |
---|---|
front | 返回第一个节点中值的引用 |
back | 返回最后一个节点中值的引用 |
如果需要进行遍历,由于list特性,是不支持直接使用[]进行随机访问的,需要我们通过头节点逐个迭代。
修改
函数名称 | 功能 |
---|---|
push_front | 头插一个元素 |
pop_front | 头删一个元素 |
push_back | 尾插一个元素 |
pop_back | 尾删一个元素 |
insert | pos位置插入元素 |
erase | pos位置删除元素 |
swap | 交换两个list中的元素 |
clear | 清空list中的元素 |
请注意:针对迭代器失效的问题,在vector中我们说,任何可能会导致扩容的操作都可能会导致迭代器失效,同时删除也会导致删除当前位置以及后续所有的迭代器失效。但是在list中,由于使用链式存储方式,因此不存在扩容的情况,因此扩容不会导致迭代器失效,而删除操作会导致当前位置的迭代器失效,并不会影响后续的迭代器。
list和vector的区别
由于vector和list两个容器的底层结构不同,导致其特性以及应用场景不同。
vector | list | |
---|---|---|
底层结构 | 动态的顺序表,一段连续空间 | 带头节点的双向循环链表 |
随机访问 | 支持随机访问,访问效率O(1) | 不支持,访问效率O(n) |
插入和删除 | 在任意位置插入和删除的效率低,需要整个搬移元素,时间复杂度为O(n),插入时可能要增容,效率低 | 支持在任意位置的插入和删除时间复杂度都为O(1),并且无需扩容,拷贝元素,效率高 |
空间利用率 | 底层为连续空间,不易造成内存碎片,空间利用率高,缓存利用率高 | 底层动态开辟节点,小节点容易造成内存碎片,空间利用率低,缓存利用率低 |
迭代器 | 例如需要进行++,迭代器为原生态的指针,指针++也就是向后偏移一个元素 | 需要对指针进行封装,因为迭代器本身是不能通过++访问到下一个元素的(元素之间使用指针相连) |
迭代器失效 | 插入元素时,可能会导致扩容,这样就会使得所有的迭代器都失效,因此需要对迭代器重新赋值,删除元素时也需要重新赋值,否则也会失效 | 插入元素不会扩容,只有删除元素会导致当前位置迭代器失效,其他位置迭代器没有影响 |
使用场景 | 需要高效存储支持随机访问的场景,不关心插入删除的效率 | 涉及到大量的插入和删除,不关心随机访问 |
相关文章:

【C++】STL标准库之list
STL标准库之list list类的简介常用的list类的接口构造迭代器容量访问修改 list和vector的区别 list类的简介 list是一种序列式容器,可以在任意位置插入和删除元素,并且其时间复杂度为O(1),在底层,list是双向链表结构,…...

Nomogram | 盘点一下绘制列线图的几个R包!~(二)
1写在前面 不知道各位小伙伴的五一假期过的在怎么样,可怜的我感冒了。😷 今天继续之前没有写完的列线图教程吧,再介绍几个制作列线图的R包。🤠 2用到的包 rm(list ls())library(tidyverse)library(survival)library(rms)library(…...
Django之定时任务django-crontab
Django之定时任务django-crontab crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务符号方法解决crontab中文问题管理定时任务注意 crontab Django可以使用第三方库如django-crontab来实现定时任务的调度。该库允许使用类似于crontab文件格式的语法指定任…...
linux常见命令
ls:列出当前目录下的所有文件和子目录 cd:切换当前工作目录,例如 cd /home/user 进入 /home/user 目录 pwd:显示当前工作目录的路径 mkdir:创建一个新目录,例如 mkdir newdir 创建一个名为 newdir 的目录…...

【14.HTML-移动端适配】
移动端适配 1 布局视口和视觉视口1.1 设置移动端布局视口宽度 2 移动端适配方案2.1 rem单位动态html的font-size;2.2 vw单位2.3 rem和vw对比2.4 flex的弹性布局 1 布局视口和视觉视口 1.1 设置移动端布局视口宽度 避免布局视口宽度默认980px带了的缩放问题,并且禁止…...

平衡二叉树旋转机制
概念 平衡二叉树的旋转机制是一种通过对树进行旋转操作来保持其平衡的方法。 分类 平衡二叉树的旋转机制包括两种基本类型的旋转:左旋和右旋,以及它们的组合。 左旋 左旋是将一个节点的右子节点旋转到它的位置上,同时将该节点移到其左侧&…...

深入浅出C++ ——C++11
文章目录 一、C11简介二、列表初始化二、声明四、范围for循环五、STL中的变化六、右值引用和移动语义1. 什么是左值?什么是左值引用?2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 完美转发 新的类功能默认成员函数类成员变量初始化defaultdele…...

智能座舱3.0阶段,看全球巨头如何打造更具“价值”的第三空间
面向中国这一全球最大的汽车电动化与智能化单一市场,作为全球第七大汽车技术供应商的FORVIA佛瑞亚集团开始全面发力。 在2023年上海国际车展上,FORVIA佛瑞亚携旗下佛吉亚与海拉一系列突破性技术和互动体验亮相,展示了对电气化与能源管理、安…...

【Linux】入门介绍
🌱博客主页:大寄一场. 🌱系列专栏:Linux 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 前言 Linux背景介绍 1.发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 官网 4. 企业应用现状 5. 发行版…...

【Python】序列类型②-元组
文章目录 1.元组简介2.元组的定义2.1定义只有一个元素的元组 3.元组的下标访问4.元组的常用方法5.使用in判断是否存在元素6.多元赋值操作 1.元组简介 元组和列表一样可以存放多个,不同数据类型的元素 与列表最大的不同就是:列表是可变的,而元组不可变 2.元组的定义 元组的定义:…...
循环的数字
循环的数字 题目描述 你曾经因为看见一样的东西一遍又一遍地重复、循环而对电视节目感到厌烦么?好吧,虽然我并不关心电视节目的好坏,不过有时却也很像那样不断循环的数字。 让我们假定两个不同的正整数 ( n , m ) (n, m) (n,m) 是循环的&…...
MySQL查询之聚合函数查询
0. 数据源 student.sql文件。 /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80016Source Host : localhost:3306Source Schema : testdbTarget Server Type : MySQLTa…...

普通2本,去过字节外包,到现在年薪25W+的测试开发,我的2年转行心酸经历...
个人简介 我是一个普通二本大学机械专业毕业,17年毕业,19年转行,目前做IT行业的软件测试已经有3年多,职位是高级测试工程师,坐标上海… 我想现在我也有一点资格谈论关于转行这个话题;希望你在决定转行之前…...
util.callbackify
util.callbackify(original) 将 async 异步函数(或者一个返回值为 Promise 的函数)转换成遵循异常优先的回调风格的函数,例如将 (err, value) > ... 回调作为最后一个参数。 在回调函数中,第一个参数为拒绝的原因(如…...
解决使用CLIP模型时TypeError: Cannot handle this data type: (1, 1, 224, 224), |u1
想提供Huggingface的transformer库实现多模态模型CLIP的推断,结果报错 (myenv) rootd27d1ff1836c:/home/model_test# python3 CLIP.py ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy. Traceback (most recent call last): File “/hom…...

Mysql第二章 多表查询的操作
这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接,把没有部门的员工也查出来sql99语法实现右外连接,把没有人的部门查出来sql99语法实现满外连接,mysql不支持这样写mysql中如果要实现满外连接的…...
ESP32-CAM:TinyML 图像分类——水果与蔬菜
目录 故事 硬件参数: 在 Arduino IDE 上安装 ESP32-Cam 使用 BLINK 测试电路板 测试无线网络 运行您的 Web 服务器 水果与蔬菜-图像分类 下载数据集 使用 Edge Impulse Studio 训练模型...

如何防止订单重复支付
想必大家对在线支付都不陌生,今天和大家聊聊如何防止订单重复支付。 看看订单支付流程 我们来看看,电商订单支付的简要流程: 订单钱包支付流程 从下单/计算开始: 下单/结算:这一步虽然不是直接的支付起点,但…...
不是那么快乐的五一
大家好,我是记得诚。 五一假期结束了,明天开始上班了。 这个假期没休息好,也没出去玩。 放假前一天,接到通知让加班。 第一天就去公司加班了,属实很难受,我心想如果别人有了出远门的安排,还…...

Maven命令和配置详解
Maven命令和配置详解 1. pom基本结构2. build基本结构3. Maven命令详解3.1 打包命令3.2 常用命令3.3 批量修改版本-父子pom4. Maven配置详解4.1 settings.xml4.2 项目内的maven工程结构Maven POM构建生命周期工程实践1. pom基本结构 <?xml versi...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...

Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...

【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...