STL解析——list的使用
目录
1.简介
2.构造函数
3.迭代器
3.1封装
3.2迭代器分类
4.排序性能
4.1链式与数组
4.2缓存读取
1.简介
STL容器中提供的list容器也是一种顺序容器,底层实现方式是带头双向链表,这种实现方式能比单链表更高效的访问数据。
下面围绕部分重要接口的使用展开讲解。
2.构造函数
list的构造函数提供了空初始化、元素个数初始化、迭代器区间初始化等
这里只需注意迭代器区间初始化除了使用list容器的迭代器区间,也可使用其他类迭代器区间。代码演示如下:
void list_test01()
{//空初始化list<int> lt1;for (auto e : lt1){cout << e << ' ';}cout << endl << endl;//元素个数(size)初始化list<int> lt2(10, 1);for (auto e : lt2){cout << e << ' ';}cout << endl << endl;//迭代器区间初始化list<int> lt3(lt2.begin(), lt2.end());for (auto e : lt3){cout << e << ' ';}cout << endl;int arr[] = { 0,1,2,3,4 };list<int> lt4(arr, arr + 5);for (auto e : lt4){cout << e << ' ';}cout << endl << endl;}
打印结果如下:
3.迭代器
3.1封装
之前我门在学习string和vector时,模拟实现的迭代器是一种指针,通过指针的加减和解引用能快速迭代容器内元素,但这仅是对string和vector底层仅是数组结构的迭代器实现方式。对于链表这种底层空间不连续的链式结构,通过指针是无法顺利迭代容器内元素的,但我们还是可以将迭代链表元素的方式封装成迭代器。
迭代器的功能是通过简单的加减和解引用方式来访问容器内元素,因此对于链表这种结构我们可以将迭代器创建为一种类,将访问链表的底层代码放入类中实现,再将迭代器类的运算符进行重载,进而封装成我们现在看到的迭代器。这种将底层复杂的方式抽象整合为一种统一的方式的思想,就体现了封装思想。
拿现实中例子举例,类似于移动支付未出现前的银行卡,各银行的底层识别方式不同,因此跨行操作及其不方便,但微信/支付宝的移动支付则是将这种底层识别封装为统一的支付款,减小了底层差异带来的影响。
拿list的迭代器区间初始化举例:
void list_test02()
{string s = "abcdef";vector<int> v1 = { 1,1,1,1,1,1,1 };list<int> l1 = { 0,0,0,0,0, };list<char> lt1(s.begin(), s.end());list<char> lt2(v1.begin(), v1.end());list<char> lt3(l1.begin(), l1.end());
}
若没有封装迭代器,那么对于跨容器初始化我们需要对每种容器都进行实现方式,调用时及其不方便。但我们将各容器封装了迭代器,由此可进行统一的迭代器初始化。
3.2迭代器分类
在对之前文档进行查看时不难发现,不同函数的接口的迭代器名称不同:
像排序(sort)的随机迭代器
逆置(reverse)的双向迭代器
删除(remove)的单向迭代器
因此迭代器的分类大体如下:
(1)随机迭代器:随机迭代器的意思是能任意访问迭代器中任何位置,像vector和string底层为数组结构的迭代器就是随机迭代器。可以进行++,--,+,- 操作。
(2)双向迭代器:双向迭代器意思是可以向前或向后依次访问元素,但只能从一个数据访问到下一个或前一个数据,不能随意访问任意元素,像list这种双向链表就是双向迭代器。可以进行++和--。
(3)单向迭代器:只能向前依次访问数据,像数据结构中的单链表就是单向迭代器。只能进行++。
三种迭代器的关系类似功能继承,比如单向迭代器能用的地方双向迭代器也能用,而双向迭代器能用的地方,单向迭代器不一定能用。
以sort进行举例:
void list_test03()
{vector<int> v1 = { 10,2,3,5,1,9 };list<int> lt1 = { 10,2,3,5,1,9 };sort(v1.begin(), v1.end());sort(lt1.begin(), lt1.end());
}
运行结果如下:
可以看到直接报错了。
4.排序性能
4.1链式与数组
list与vector都是顺序容器,list有自带的sort接口,vector排序主要使用函数库的sort函数,两个排序底层都是快排,按理来说两种容器的排序时间复杂度都是O(nlogn),但实际使用效率相同吗?根据下下面代码进行深入了解:
//排序效率
void list_test04()
{srand(time(0));const int N = 100000;list<int> lt1;vector<int> v;for (int i = 0; i < N; ++i){auto e = rand() + i;lt1.push_back(e);v.push_back(e);}int begin1 = clock();// 排序sort(v.begin(), v.end());int end1 = clock();int begin2 = clock();lt1.sort();int end2 = clock();printf("vector sort:%d\n", end1 - begin1);printf("list sort:%d\n", end2 - begin2);
}
此代码最后会打印两种容器排序所需的实际时间(ms),运行(VS2022,X86,release环境)结果如下:
可以看到时间list的性能是比vector差很多的,那相同的时间复杂度为何差异如此之大呢?
4.2缓存读取
主要原因是和内存缓存有关,由于内存的读取性能较差,为了高效读取数据,在内存与cpu间设置了缓存器,缓存器的主要特点是内存小、读取速度快。对于数组这样的连续结构,会一次将多个字节数据储存在缓存器中,那么cpu对于vector数据的读取在缓存器中命中率更高,而list的数据不是连续内存存储,因此命中率会更低。由此导致了list与vector的时间效率不同。
相关文章:

STL解析——list的使用
目录 1.简介 2.构造函数 3.迭代器 3.1封装 3.2迭代器分类 4.排序性能 4.1链式与数组 4.2缓存读取 1.简介 STL容器中提供的list容器也是一种顺序容器,底层实现方式是带头双向链表,这种实现方式能比单链表更高效的访问数据。 下面围绕部分重要接口…...
华为大规模——重塑生产力
华为大模型通过以下几个方面重塑生产力: 提供强大算力支持 华为致力于构建领先的昇腾人工智能算力平台,推出高性能昇腾AI集群,支持月级长期稳定训练,可靠性业界领先。同时打造开放的昇腾计算平台,兼容主流算子、框…...
【Go面试陷阱】对未初始化的chan进行读写为何会卡死?
Go面试陷阱:对未初始化的chan进行读写为何会卡死?深入解析nil channel的诡异行为 在Go的世界里,var ch chan int 看似人畜无害,实则暗藏杀机。它不会报错,不会panic,却能让你的程序悄无声息地"卡死&qu…...
SpringBoot自动化部署实战技术文章大纲
技术背景与目标 介绍SpringBoot在现代开发中的重要性自动化部署的价值:提升效率、减少人为错误、实现CI/CD适用场景:中小型Web应用、微服务架构 自动化部署核心方案 基于Docker的容器化部署 SpringBoot应用打包为Docker镜像使用Docker Compose编排多容…...
软件项目管理(3) 软件项目任务分解
一、相关概念 1.任务分解的方法和步骤 (1)方法 模板参照方法:参照有标准或半标准的任分解结构图类比方法:任务分解结构图经常被重复使用,具有相似性自顶向下方法:一般->特殊,演绎推理从大…...

MQTTX连接阿里云的物联网配置
本文的目标是通过MQTTX的客户端,连接到阿里云的物联网的平台,发送温度信息,在阿里云的平台中显示出来。阿里云免费注册,免费有一个MQTT的服务器。有数量限制,但是对于测试来讲,已经足够。 1、注册阿里云的物…...

20250606-C#知识:匿名函数、Lambda表达式与闭包
C#知识:匿名方法、Lambda表达式与闭包 闭包乍一听感觉很复杂,其实一点也不简单 1、匿名方法 没有方法名的方法一般用于委托和事件 Func<int, int, int> myAction delegate(int a, int b) { return a b; }; Console.WriteLine( myAction(1, 2)…...
数字证书_CA_详解
目录 一、数字证书简介 二、 CA(证书颁发机构) (一) 证书链(信任链) 1. 根证书 2. 中间证书 3. 网站证书 (二) 抓包软件的证书链与信任机制 1. 抓包通信流程 2. 证书链伪造与信任验证流程 (三) 关于移动设备的CA 一、数…...

衡量嵌入向量的相似性的方法
衡量嵌入向量的相似性的方法 一、常见相似性计算方法对比 方法核心原理公式优点缺点适用场景余弦相似度计算向量夹角的余弦值,衡量方向相似性,与向量长度无关。$\text{cos}\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{a}\mathbf{b}欧氏距离计算向量空间中的直线距离…...
Python爬虫实战:Yelp餐厅数据采集完整教程
前言 在数据分析和商业智能领域,餐厅和商户信息的采集是一个常见需求。Yelp作为全球知名的本地商户评论平台,包含了大量有价值的商户信息。本文将详细介绍如何使用Python开发一个高效的Yelp数据爬虫,实现商户信息的批量采集。 技术栈介绍 …...
微服务常用日志追踪方案:Sleuth + Zipkin + ELK
在微服务架构中,一个用户请求往往需要经过多个服务的协同处理。为了有效追踪请求的完整调用链路,需要一套完整的日志追踪方案。Sleuth Zipkin ELK 组合提供了完整的解决方案 Sleuth:生成和传播追踪IDZipkin:收集、存储和可视化…...

API是什么意思?如何实现开放API?
目录 一、API 是什么 (一)API 的定义 (二)API 的作用 二、API 的类型 (一)Web API 1. RESTful API 2. SOAP API (二)操作系统 API (三)数据库 API …...
12.6Swing控件4 JSplitPane JTabbedPane
JSplitPane JSplitPane 是 Java Swing 中用于创建分隔面板的组件,支持两个可调整大小组件的容器。它允许用户通过拖动分隔条来调整两个组件的相对大小,适合用于需要动态调整视图比例的场景。 常用方法: setLeftComponent(Component comp)&a…...

Python训练第四十六天
DAY 46 通道注意力(SE注意力) 知识点回顾: 不同CNN层的特征图:不同通道的特征图什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。通道注意力:模型的定义和插入的位置通…...
C++编程——关于比较器的使用
注: 简单记录一下C里比较器的构建,常用于自定义 sort() 函数和优先队列的改写优先级。 简单构建比较器: sort() 函数: vector<int> arr;//(a, b) -> true : a < b //升序排列 bool compare(int a, int b) {retur…...

第2天:认识LSTM
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: pytorch (二)具体步骤…...

自动化提示生成框架(AutoPrompt)
自动化提示生成框架(AutoPrompt) 一、核心创新点 自动化提示生成框架(AutoPrompt) 创新本质:提出基于梯度引导搜索的自动化提示生成方法,替代人工设计模板的传统模式。技术路径: 将提示视为可训练的离散token序列,通过优化提示向量(prompt embedding)搜索语义空间。利…...
两轮自平衡机器人建模、LQR控制与仿真分析
以下是一个针对两轮自平衡机器人(平衡车) 的完整建模、控制设计与仿真分析报告,包含详细的理论推导、控制算法实现及Python仿真代码。 两轮自平衡机器人建模、LQR控制与仿真分析 1. 引言 两轮自平衡机器人是一种典型的欠驱动、非线性、不稳定系统,其动力学特性与倒立摆高度…...
在NLP文本处理中,将字符映射到阿拉伯数字(构建词汇表vocab)的核心目的和意义
一、词汇表的核心作用 数值化表示 将离散的文本字符转换为连续的数值索引,使计算机能够处理非结构化的语言数据57。例如: "中国" → 2"a" → 5 统一输入格式 不同长度的文本通过填充/截断转换为固定长度的数字序列…...

中国首套1公里高分辨率大气湿度指数数据集(2003~2020)
时间分辨率:月空间分辨率:100m - 1km共享方式:开放获取数据大小:34.79 GB数据时间范围:2003-01-01 — 2020-12-31元数据更新时间:2023-07-26 数据集摘要 中国首套1公里高分辨率大气湿度指数数据集…...

计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析
追踪计算机视觉领域的前沿热点是把握技术发展方向、推动创新落地的关键,分析这些热点,不仅能洞察技术趋势,更能为科研选题和工程实践提供重要参考。本文对计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点进行了…...

python学习打卡day45
DAY 45 Tensorboard使用介绍 知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策…...
JAVA元编程
一、引言:元编程的本质与 Java 实现 元编程(Metaprogramming)是一种 “操纵程序的程序” 的编程范式,其核心思想是通过代码动态操作代码本身。在 Java 中,元编程主要通过 ** 反射(Reflection)、…...

Verilog编程技巧01——如何编写三段式状态机
前言 Verilog编程技巧系列文章将聚焦于介绍Verilog的各种编程范式或者说技巧,编程技巧和编程规范有部分重合,但并非完全一样。规范更注重编码的格式,像变量命名、缩进、注释风格等,而编程技巧则更偏重更直观易读、更便于维护、综合…...

智启未来:当知识库遇见莫奈的调色盘——API工作流重构企业服务美学
目录 引言 一、初识蓝耘元生代MaaS平台 1.1 平台架构 1.2 平台的优势 1.3 应用场景 二、手把手教你如何在蓝耘进行注册 (1)输入手机号,将验证码正确填入即可快速完成注册 (2)进入下面的页面表示已经成功注册&…...
java教程笔记(十一)-泛型
Java 泛型(Generics)是 Java 5 引入的重要特性之一,它允许在定义类、接口和方法时使用类型参数。泛型的核心思想是将类型由具体的数据类型推迟到使用时再确定,从而提升代码的复用性和类型安全性。 1.泛型的基本概念 1. 什么是泛…...
JUnit 和 Mockito 的详细说明及示例,涵盖核心概念、常用注解、测试场景和实战案例。
一、JUnit 详解 1. JUnit 核心概念 测试类:以 Test 结尾的类(或通过 Test 注解标记的方法)。断言(Assertions):验证预期结果与实际结果是否一致(如 assertEquals()࿰…...
【Go语言基础【7】】条件语句
文章目录 零、概述一、if 条件语句1. 单条件模型2. 多条件模型(else if)3. 条件嵌套与优化 二、switch 条件判断1. 基本用法2. fallthrough 穿透执行3. break 终止执行 零、概述 语句类型适用场景核心特点if-else单条件或简单多条件判断逻辑清晰&#x…...
【Python 算法零基础 4.排序 ⑪ 十大排序算法总结】
目录 一、选择排序回顾 二、冒泡排序回顾 三、插入排序回顾 四、计数排序回顾 五、归并排序回顾 六、快速排序回顾 七、桶排序回顾 八、基数排序 九、堆排序 十、希尔排序 十一、十大排序算法对比 十二、各算法详解与应用场景 1. 选择排序(Selection Sortÿ…...
解决神经网络输出尺寸过小的实战方案
训练CIFAR10分类模型时出现报错:RuntimeError: Given input size: (256x1x1). Calculated output size: (256x0x0). Output size is too small。该问题由网络结构设计缺陷导致图像尺寸过度缩小引发。 核心原因分析 网络结构缺陷 原始模型采用六层卷积层,…...