【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...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
