小解List的使用【C++】
小解List的使用【C++】
- 一. List
- 1.1. 与vector的不同
- 1.2 与vector的使用不同
- 1.2.1 迭代器失效
- 1.2.2. insert
- 1.2.3 erase
- 1.2.4 sort
- 1.3. 其他接口
- 补充迭代器
- 容器与迭代器的关系
- 迭代器的类型
一. List
学习了STL,也已经到了List的内容
因为List与string以及vector比起来还是有很大不同的,所以这里稍微除了一篇小博客主要来讲解一下
相对于vector以及string,List中比较特殊的部分。
1.1. 与vector的不同
我们再学习这个List之前:
大部分人应该都已经知道list的底层实际上是:双向带头循环链表
这个其实以前博主再博客中实现过。
这里也不深究
string和vector实际上本质是顺序表
这两个类型的最大区别就是:
vector在内存中相当于动态开辟的数组,地址是连续的
链表中的节点则不是连续的,在内存中表现的是断开的,不连续的形式
所以vector的区别和使用上的区别也都是围绕着这个展开的。
与string有较大的不一样,因为空间不连续
1.2 与vector的使用不同
这里主要挑出来几个常用的功能
来体验一下vector与list的区别。
1.2.1 迭代器失效
还记得在vector中的迭代器失效吗
就是当使用迭代器进行insert和erase后,
重新使用迭代器对象进行操作
因为迭代器指向的位置虽然没变,但是指向的值却已经发生了变化。
在vs编译器下,直接限制了用户对erase与insert后的指针对象的使用。
#include<iostream>
#include<vector>
#include"vector.h"
int main()
{std::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);std::vector<int>::iterator begin = v1.begin();v1.erase(begin);while (begin != v1.end()){std::cout << *begin;begin++;}
}
就是上面的情况。
但是我们把目光转向list,看看list中是否存在迭代器失效的结果。
1.2.2. insert
这里我们直接进行测试把
int main()
{vector<int> v1;vector<int>::iterator it = v1.begin();v1.insert(it, 1);v1.insert(it, 2);
}
这里先用vector进行测试
很明显是行不通的,因为it被连续调用了两次。

这里就用list进行测试:


这里能发现并没有报错。
这里其实我们细想一下也能明白
list使用insert时候
list中的地址指向的值没有发生变化
因为他们本身就是不连续的,数据插入后,他们指针指向的位置依旧还是原来的值。
所以不会出现和vector一样的情况——移动后,前面的元素,会取代原来的值所以指针指向的值就发生了变化。
所以用insert不会发生迭代器失效的问题。
这里又要提出一个小问题:
因为vector的地址是连续的,在insert中可以直接用:
v1.insert(it+5,2);
表示在迭代器的+5的位置处进行插入。
这里vector能这么用,是因为vector的迭代器能支持加减,因为vector的地址是连续的
但是list的话因为地址不一样,所以是不是可能就不行了。
这里我们来试一下

这里就非常明显的报错了。
所以我们list想在迭代器后面进行插入就要自己让迭代器去++;
比如这里:
想要到迭代器后的第三个位置进行插入
std::list<int>::iterator it=s1.begin();
for(int i=0;i<3;i++)
{it++;
}
1.2.3 erase
其实erase这里不用实验。想想就能知道了
erase的作用是删除节点。
那节点都删除了,迭代器指向的指针位置肯定也消失了。
所以这里就不实验了,毫无疑问。
那问题应该是怎么解决:
其实这里和vector里的一样:
it=it.erase();
it会自带返回迭代器
返回的指向对象正是迭代器删除的对象的下一个指向对象。
1.2.4 sort
我们知道在算法中有一个qsort算法。
但是在list中,list自带了一个qsort接口,方便用户进行排序。
但是这里我们并不提倡用这个qsort
因为:
sort():
算法中的sort效率远高于list的sort效率
数据量差的越多,效率差距越大
因为算法中的sort用的是快速排序
而因为list中的地址不是连续的,所以并不能用快速排序,只能用归并排序进行实现
这里我们能来进行测试以下:
这里把测试函数塞进来:
void test2()
{int N = 1000000;//测试的数字的多少std::vector<int>v1;//添加随机值给vectorfor (int i = 0; i < N; i++){auto s = rand();v1.push_back(s);}//给list添加随机值std::list<int> l1;for (int i = 0; i < N; i++){auto s = rand();l1.push_back(s);}//排序list并记录时间int begin1 = clock();l1.sort();int end1 = clock();//排序vector并记录时间int begin2 = clock();sort(v1.begin(), v1.end());int end2 = clock();std::cout << "vector " << end2 - begin2 << std::endl;std::cout << "list " << end1 - begin1 << std::endl;
}

这里我们能看到list和vector的效率差距还是十分大的。
所以还是不推荐用list的sort的
那我们想要排序list中的数怎么办。
我们可以将list中的数字拷贝进vector中,然后再vector排序完了后,赋值给list
void test3()
{int N = 1000000;std::vector<int>v1;for (int i = 0; i < N; i++){auto s = rand();v1.push_back(s);}std::list<int> l1;for (int i = 0; i < N; i++){auto s = rand();l1.push_back(s);}int begin1 = clock();sort(v1.begin(), v1.end());int end1 = clock();int begin2 = clock();std::vector<int>v2;for (auto i : l1){v2.push_back(i);}sort(v2.begin(), v2.end());size_t i = 0;//将vector赋值给listfor (auto& z : l1){z = v2[i++];}int end2 = clock();std::list<int> l2;for (int i = 0; i < N; i++){auto s = rand();l2.push_back(s);}int begin3 = clock();l2.sort();int end3 = clock();std::cout << "vector " << end1 - begin1 << std::endl;std::cout << "list_good " << end2 - begin2 << std::endl;std::cout << "list " << end3 - begin3 << std::endl;}
1.3. 其他接口
这里的其他接口就不进行演示了
这里贴个网址自己去使用即可:
List的其他接口
补充迭代器
这里因为vector与list有许多的不同。
所以他们的迭代器有很大的不同,这里就补充一下迭代器。
容器与迭代器的关系
我们都知道:
容器使用来存储数据的
算法是用来处理数据的。
而迭代器是用来链接容器和算法之间的桥梁。
有了迭代器,算法就可以通过访问迭代器改变容器中的数据。
所以对于迭代器来说要通过容器的性质来进行设计。
容器的不同会导致迭代器的类型也不同
迭代器的类型

这里的容器种类不同,迭代器的种类也不同。
迭代器的种类不同,我们能看到他们支持的运算符种类也不同。
相关文章:
小解List的使用【C++】
小解List的使用【C】 一. List1.1. 与vector的不同1.2 与vector的使用不同1.2.1 迭代器失效1.2.2. insert1.2.3 erase1.2.4 sort1.3. 其他接口 补充迭代器容器与迭代器的关系迭代器的类型 一. List 学习了STL,也已经到了List的内容 因为List与string以及vector比起…...
自动驾驶高效预训练--降低落地成本的新思路(AD-PT)
自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点:通过预训练的方式,可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…...
Spring笔记(四)(黑马)(web层解决方案-SpringMVC)
01、Spring MVC 简介 1.1 SpringMVC概述 SpringMVC是一个基于Spring开发的MVC轻量级框架,Spring3.0后发布的组件,SpringMVC和Spring可以无 缝整合,使用DispatcherServlet作为前端控制器,且内部提供了处理器映射器、处理器适配器…...
企业如何实现高效运转?工单管理系统有什么特点和优势?
在当今这个数字化、信息化的时代,企业需要一个高效、智能的工具来优化和协调内部和外部的工作流程。工单管理系统正是这样一个不可或缺的软件工具,它能够自动化、智能化地处理工单,提高工作效率和客户满意度。本文将详细介绍工单管理系统的特…...
工业摄像机参数计算
在工业相机选型的时候有点懵,有一些参数都不知道咋计算的。有些概念也没有区分清楚。‘’ 靶面尺寸 CMOS 或者是 CCD 使用几分之几英寸来标注的时候,这个几分之几英寸计算的是什么尺寸? 一开始我以为这个计算的就是靶面的实际对角线的尺寸…...
Android系统中设置TextView的行间距
Android系统中TextView默认显示中文时会比较紧凑,不是很美观。 为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier。 1、设置行间距:android:lineSpacingExtra,取值范围…...
嵌入式养成计划-47----QT--基于QT的OpenCV库实现人脸识别功能
一百二十一、基于QT的OpenCV库实现人脸识别功能 121.1 UI 界面 登录按钮现在没啥实际作用,因为没加功能,可以添加在识别成功后运行的功能代码 121.2 思路 显示人脸: 通过 VideoCapture 这个类下面的 open() 方法打开摄像头,对…...
MySQL(12):MySQL数据类型
MySQL中的数据类型 常见数据类型的属性: 整数类型 整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。 CREATE TABLE test_int1 ( X TINYINT, y SMALLINT, z MEDIUMINT, m INT, n BIGINT );…...
哪款手机便签软件支持存储录音文件并支持转文字?
手机便签类软件带有存储录音转文字功能是比较实用的,很多人通常会整理很多录音类型的文件,录音文件整合在一起后,后续有需要可以逐条点开播放收听。尤其是在工作中,当领导说一些重点时,大家无法借助灵活的大脑来成功的…...
Health Kit申请验证有问题?解决方案全解析
在接入Health Kit的过程中,应用上线前需要完成申请验证环节,获得正式的运动健康权限。 我们贴心整理了申请验证被驳回的高频问题,您可以在申请前阅读以下内容,避免在您的申请材料中出现下述问题影响审核通过的进度哦!…...
2007-2022年上市公司工业机器人渗透度数据
2007-2022年上市公司工业机器人渗透度数据 1、时间:2007-2022年 2、指标:股票代码、年份、工业机器人渗透度 3、计算方式:首先,计算行业层面的工业机器人渗透度指标;其次,构建企业层面的工业机器人渗透度…...
k8s基础环境部署
目录 跨主机免密认证 禁用selinux--所有主机操作 1.使用sed 2.直接更改配置文件 3.重启才能生效 禁用swap--所有主机操作 网络参数调整--所有主机 部署docker环境--所有主机 1.配置软件源 2.安装最新版docker 3.设置开机自启 4.配置docker加速器 5.重启服务 cri环境…...
家用工作站方案:ThinkBook 14 2023 版
本篇文章聊聊今年双十一,我新购置的家用工作站设备:ThinkBook 14 2023,一台五千元价位,没有显卡的笔记本。我为什么选择它,它又能做些什么。 写在前面 2021 年年中的时候,我写过一篇《廉价的家用工作站方…...
电脑篇——本地串口转TCP,TCP转虚拟串口,网络调试助手,串口调试助手
TCP/UDP工具、串口工具 https://pan.baidu.com/s/1SY03d_RRVhyOZfsPlApmxg?pwd5555 今日有个需求,就是在本机电脑上接了一个串口设备,然后我的QtCreator是在内网远程电脑运行的,我想将串口设备“挂载”到远程电脑上去调试程序,于…...
igbt好坏判断方法有哪些?万用表怎么测试igbt的好坏?
什么是IGBT? IGBT即绝缘栅双极型晶体管,是一种复合全控型电压驱动式功率半导体器件,是电力控制和电力转换的核心器件,在高电压和高电流的光伏逆变器、储能装置和新能源汽车等领域被广泛应用。IGBT具有高输入阻抗,低导通压降&…...
Android UI 开发·界面布局开发·案例分析
目录 编辑 1. 线性布局(LinearLayout) 2. 相对布局(RelativeLayout) 3. 表格布局(TableLayout) 4. 帧布局(FrameLayout) 5. 网格布局(GridLayout࿰…...
2023-11-06 monetdb-事务-insert-delta缓存-分析
摘要: monetdb在事务处理时, 会将数据写入delta缓存中, 然后在commit时将数据写入wal文件, 随后由控制器决定何时将wal中的数据真正的写入BAT列文件中. 本文从delta缓存入手, 分析monetdb在事务处理中的细节. SQL: DML: create table t1 (a int); 事务DDL: START TRANSACTI…...
ubuntu 22.04 flameshot 截图异常的问题
方法找了好久,终于找到一个有用的 Firstly do not install flameshot from snapstore, install it using apt. Go to /etc/gdm3/custom.confRemove the comment on #WaylandEnablefalse Your custom.conf file should be like this: # GDM configuration storag…...
正点原子嵌入式linux驱动开发——Linux WIFI驱动
WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI,本章就来学习一下如何…...
React中的“状态”(state)和“属性”(props)的区别
在React中,"状态"(state)和"属性"(props)是两个重要的概念,它们在组件的生命周期和数据流中扮演着不同的角色。 状态(State): 状态是React组件中用…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
软件工程教学评价
王海林老师您好。 您的《软件工程》课程成功地将宏观的理论与具体的实践相结合。上半学期的理论教学中,您通过丰富的实例,将“高内聚低耦合”、SOLID原则等抽象概念解释得十分透彻,让这些理论不再是停留在纸面的名词,而是可以指导…...
PostgreSQL 对 IPv6 的支持情况
PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议,包括连接、存储和操作 IPv6 地址。以下是详细说明: 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置: listen_addresses 0.0.0.0,:: # 监听所有IPv4…...
Modbus转ETHERNET IP网关:快速冷却系统的智能化升级密钥
现代工业自动化系统中,无锡耐特森Modbus转Ethernet IP网关MCN-EN3001扮演着至关重要的角色。通过这一技术,传统的串行通讯协议Modbus得以在更高速、更稳定的以太网环境中运行,为快速冷却系统等关键设施的自动化控制提供了强有力的支撑。快速冷…...
