小解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组件中用…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
