黑马c++ STL部分 笔记(7) list容器
list基本概念
功能:将数据进行链式存储
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
list的优点:
采用动态存储分配,不会造成内存浪费和溢出
链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点:
链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
总结:STL中List和vector是两个最常被使用的容器,各有优缺点
1.list构造函数
// list构造函数
/*
list<T> lst; //list采用采用模板类实现,对象的默认构造形式:
list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem); //构造函数将n个elem拷贝给本身。
list(const list &lst); //拷贝构造函数。
*/
#include <bits/stdc++.h>
using namespace std;
void printlist(list<int> &l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{list<int> l1; // 默认构造// 添加数据l1.push_back(10);l1.push_back(20);l1.push_back(30);l1.push_back(40);printlist(l1); // 10 20 30 40// 区间方式构造list<int> l2(l1.begin(), l1.end());printlist(l2); // 10 20 30 40list<int> l3;l3 = l2;printlist(l3); // 10 20 30 40list<int> l4(3, 100); // n个elementprintlist(l4); // 100 100 100
}
int main()
{test01();
}
/*
总结:
list构造方式同其他几个STL常用容器,熟练掌握即可
*/
2.list 赋值和交换
// list 赋值和交换
/*
list& operator=(const list &lst); //重载等号操作符
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem); //将n个elem拷贝赋值给本身。
swap(lst); //将lst与本身的元素互换。
*/
#include <bits/stdc++.h>
using namespace std;
void printlist(list<int> &l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{list<int> l1;// 添加数据l1.push_back(10);l1.push_back(20);l1.push_back(30);l1.push_back(40);printlist(l1); // 10 20 30 40list<int> l2;l2 = l1; //=赋值printlist(l2); // 10 20 30 40list<int> l3;l3.assign(l2.begin(), l2.end());printlist(l3); // 10 20 30 40list<int> l4;l4.assign(3, 100); // n个element赋值printlist(l4); // 100 100 100// 交换l1.swap(l4);printlist(l1);printlist(l4);
}
int main()
{test01();
}
/*
总结:
list赋值和交换操作能够灵活运用即可
*/
3.list 大小操作
// list 大小操作
/*
size(); //返回容器中元素的个数
empty(); //判断容器是否为空
resize(num); //重新指定容器的长度为num
若容器变长,则以默认值填充新位置。
若容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem); //重新指定容器的长度为num
若容器变长,则以elem值填充新位置。
若容器变短,则末尾超出容器长度的元素被删除。
*/
#include <bits/stdc++.h>
using namespace std;
void printlist(list<int> &l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{list<int> l1;// 添加数据l1.push_back(10);l1.push_back(20);l1.push_back(30);l1.push_back(40);printlist(l1); // 10 20 30 40if (l1.empty()){cout << "l1为空" << endl;}else{cout << "l1不为空" << endl;cout << "l1的元素个数为: " << l1.size() << endl; // 4l1.resize(6);printlist(l1); // 10 20 30 40 0 0l1.resize(7, 555);printlist(l1); // 10 20 30 40 0 0 555}
}
int main()
{test01();
}
/*
总结:
判断是否为空 — empty
返回元素个数 — size
重新指定个数 — resize
*/
4.list 插入和删除
// list 插入和删除
/*
push_back(elem);//在容器尾部加入一个元素
pop_back();//删除容器中最后一个元素
push_front(elem);//在容器开头插入一个元素
pop_front();//从容器开头移除第一个元素
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
remove(elem);//删除容器中所有与elem值匹配的元素。
*/
#include <bits/stdc++.h>
using namespace std;
void printlist(list<int> &l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{list<int> l1;// 尾插l1.push_back(10);l1.push_back(20);l1.push_back(30);// 头插l1.push_front(100);l1.push_front(200);l1.push_front(300);printlist(l1); // 300 200 100 10 20 30// 尾删l1.pop_back(); // 300 200 100 10 20printlist(l1);// 头删l1.pop_front(); // 200 100 10 20printlist(l1);// insert插入list<int>::iterator it = l1.begin(); // list不能随机访问it++; // 不能it=it+2l1.insert(it, 1000); // 200 1000 100 10 20printlist(l1);it++;l1.insert(it, 1001); // 200 1000 100 1001 10 20printlist(l1);// erase删除it = l1.begin();l1.erase(it);printlist(l1); // 1000 100 1001 10 20// removel1.push_back(1000);l1.remove(1000); // 删除容器中所有与elem值匹配的元素。printlist(l1); // 100 1001 10 20// clear清空l1.clear();printlist(l1);
}
int main()
{test01();
}
/*
总结:
尾插 — push_back
尾删 — pop_back
头插 — push_front
头删 — pop_front
插入 — insert
删除 — erase
移除 — remove
清空 — clear
*/
5.list 数据存取
// list 数据存取
/*
front(); //返回第一个元素。
back(); //返回最后一个元素。
不能用[]和at,因为list不用连续的空间存储,不能随机访问
*/
#include <bits/stdc++.h>
using namespace std;
void test01()
{list<int> l1;l1.push_back(10);l1.push_back(20);l1.push_back(30);l1.push_back(40);// 不能用l1[]和l1.at()// 因为list本质上是链表,不是用连续线性空间存储数据,迭代器也是不支持随机访问的// it+1不行,it++可以;it-1不行,it--可以(支持双向)// 迭代器只能一个一个往后/前访问cout << l1.front() << " " << l1.back() << endl; // 10 40
}
int main()
{test01();
}
/*
总结:
list容器中不可以通过[]或者at方式访问数据
返回第一个元素 — front
返回最后一个元素 — back
*/
6.list 反转和排序
// list 反转和排序
/*
reverse(); //反转链表
sort(); //链表排序
*/
#include <bits/stdc++.h>
using namespace std;
void printlist(list<int> &l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
bool cmp(int l1, int l2)
{ // 降序if (l1 > l2)return true;return false;
}
void test01()
{list<int> l1;l1.push_back(20);l1.push_back(10);l1.push_back(50);l1.push_back(40);l1.push_back(30);printlist(l1); // 20 10 50 40 30// 反转reversel1.reverse();printlist(l1); // 30 40 50 10 20// sort(l1.begin(), l1.end());不对// 因为所有不支持随机访问迭代器的容器,不能用标准算法,其内部会提供相应算法l1.sort(); // 对 升序printlist(l1); // 10 20 30 40 50l1.sort(cmp); // 降序printlist(l1); // 50 40 30 20 10
}
int main()
{test01();
}
/*
总结:
反转 — reverse
排序 — sort (成员函数)
*/
相关文章:
黑马c++ STL部分 笔记(7) list容器
list基本概念 功能:将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素…...
关于使用Mxnet GPU版本运行DeepAR报错解决方案
1.引言 我们经常使用GPU来训练和部署神经网络,因为与CPU相比,它提供了更多的计算能力。在本教程中,我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先,确保您的机器中至少有一个Nvidia GPU,并正确安装了CUDA以及CUDN…...
【STM32】江科大STM32学习笔记汇总(50)
00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【STM32】STM…...
LabVIEW非接触式电阻抗层析成像系统
LabVIEW非接触式电阻抗层析成像系统 非接触式电阻抗层析成像(NEIT)技术以其无辐射、非接触、响应速度快的特点,为实时监测提供了新的解决方案。基于LabVIEW的电阻抗层析成像系统,实现了数据的在线采集及实时成像,提高…...
蓝桥杯备战刷题three(自用)
1.合法日期 #include <iostream> #include <map> #include <string> using namespace std; int main() {map<string,int>mp;int days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i1;i<12;i){for(int j1;j<days[i];j){string sto_strin…...
密码学——二次剩余
引言 二次剩余在许多密码学算法和数论问题中具有重要的作用,这个概念涉及到同余方程等概念。 同余 学习二次剩余的概念,首先要了解同余方程的概念,首先默认研究范围为整数,假设 f ( x ) f(x) f(x)是一个整系数多项式,我们讨论是否有整数值x满足同余式 f (...
10.7、华为数通HCIP-DataCom H12-821单选题:121-140
121、关于OSPF特性描述错误的是:D A、OSPF采用链路状态算法。 B、每个路由器通过泛洪 LSA 向外发布本地链路状态信息 C、每台 OSPF 设备都会收集其它路由器发来的LSA 所有的LSA 放在一起便组成了链路状态数据库LSDB, D、OSPF 区域0中所有路由器的 LSDB 都相同。 E、每台…...
多租户篇 | MatrixOne与MySQL全面对比
MySQL 是经典的关系型数据库管理系统,以其简单易用的特性在中小型业务系统中广受开发人员的喜爱。但是MySQL的架构也具有一定的局限性,在需要具备"隔离性"的业务,例如 SaaS 系统或微服务架构等对"数据隔离"及"资源隔…...
python Matplotlib Tkinter-->导出pdf报表
环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 reportlab 4.0.9 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox impor…...
react-组件基础
1.目标 能够使用函数创建组件 能够使用class创建组件 能够给React元素绑定事件 能够使用state和setState() 能够处理事件中的this指向问题 能够使用受控组件方式处理表单 2.目录 React组件介绍 React组件的两种创建方式 React事件处理 有状态组件和无状态组件 组件中的state…...
The authenticity of host ‘github.com (20.205.243.166)‘ can‘t be established.
1、运行git clone报错: The authenticity of host github.com (20.205.243.166) cant be established. ECDSA key fingerprint is SHA256:p2QAC1TJYererOttrVc98/R1BWERWu3/LiyFdHfQM. Are you sure you want to continue connecting (yes/no/[fingerprint])? 这个…...
arduino uno R3驱动直流减速电机(蓝牙控制)
此篇博客用于记录使用arduino驱动直流减速电机的过程,仅实现简单的功能:PID调速、蓝牙控制 1、直流减速电机简介2、DRV8833电机驱动模块简介3、HC-05蓝牙模块简介电机转动测试4、PID控制5、蓝牙控制电机 1、直流减速电机简介 我在淘宝购买的电机&#x…...
智能家居控制系统(51单片机)
smart_home_control_system 51单片机课设,智能家居控制系统 使用及转载请标明出处(最好点个赞及star哈哈) Github地址,带有PPT及流程图 Gitee码云地址,带有PPT及流程图 以STC89C52为主控芯片,以矩阵键…...
软考高级系统分析师之 URL 知识点和例题
一、AI 解读 URL(统一资源定位器)的结构是网络上定位资源的一种方式。一个典型的URL由几个部分组成: 协议(Scheme): 定义了用于访问资源的协议类型,如http、https、ftp等。例如,在 http://www.…...
vmware虚拟机centos中/dev/cl_server8/root 空间不够
在使用vmware时发现自己的虚拟机的/dev/cl_server8/root空间不够了,没办法安装新的服务。所以查了一下改空间的办法。 1.在虚拟机关闭的状态下,选中需要扩容的虚拟机->设置->硬件-> 硬盘->扩展->填写扩大到的值。 2.打开虚拟机ÿ…...
C++/数据结构:AVL树
目录 一、AVL树的概念 二、AVL树的实现 2.1节点定义 2.2节点插入 三、AVL树的旋转 3.1新节点插入较高左子树的左侧:右单旋 3.2新节点插入较高右子树的右侧:左单旋 3.3新节点插入较高左子树的右侧---左右:先左单旋再右单旋 3.4新节点插…...
Mysql数据库_max_allowed_packet参数详解
本文目录 参数含义查看max_allowed_packet参数值修改max_allowed_packet参数值修改配置文件方式(需要重启)直接修改配置方式(不需要重启)注意事项 出现场景 参数含义 max_allowed_packet参数指的是MySQL服务端或者客户端接收一次…...
【数仓】Hadoop集群配置常用参数说明
Hadoop集群中,需要配置的文件主要包括四个 配置核心Hadoop参数: 编辑core-site.xml文件,设置Hadoop集群的基本参数,如文件系统、Hadoop临时目录等。 配置HDFS参数: 编辑hdfs-site.xml文件,设置HDFS的相关参…...
【go从入门到精通】什么是go?为什么要选择go?
go的出生: go语言(或Golang)是Google开发的开源编程语言,诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持…...
MySQL篇—执行计划介绍(第二篇,总共三篇)
☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…...
RexUniNLU可部署方案:Docker镜像封装+FastAPI服务化生产环境落地教程
RexUniNLU可部署方案:Docker镜像封装FastAPI服务化生产环境落地教程 你是不是也遇到过这样的问题:想做一个智能客服或者信息提取工具,但一看到要标注成千上万条数据就头疼?标注成本高、周期长,而且换个业务场景&#…...
.Acwing基础课第题-简单-区间和翱
在AI辅助开发的语境下,Skill就是一个包含了领域知识、最佳实践、代码模板的知识包。 以"DAO层CRUD生成"为例,一个Skill包含: /mnt/skills/dao-crud/ ├── SKILL.md # 使用说明 │ ├── 何时使用这个Skill │ …...
C语言版:容积卡尔曼滤波(CKF)与扩展卡尔曼滤波(EKF)的锂电池SOC计算仿真模型及实现
(C语言版)扩展卡尔曼滤波器EKF的锂电池SoC计算仿真模型 容积卡尔曼滤波CKF进行锂电池SOC估计的C语言版本实现,包含定参和FFRLS两种情况,已在VS2019和Ubuntu 20.04.4版本中运行成功,根据输出文件数据在origin中绘图如图…...
告别依赖冲突!Miniconda-Python3.9新手快速部署指南
告别依赖冲突!Miniconda-Python3.9新手快速部署指南 1. 为什么你需要Miniconda? 你是否遇到过这样的情况:昨天还能运行的代码,今天突然报错"ModuleNotFoundError"?或者团队中有人能跑通的项目,…...
MogFace人脸检测模型LaTeX论文插图自动化:批量检测并标注学术图片
MogFace人脸检测模型LaTeX论文插图自动化:批量检测并标注学术图片 写论文的朋友们,尤其是做计算机视觉、人机交互或者心理学实验的,肯定都遇到过这个头疼事儿:实验部分需要展示大量带有人脸标注的图片。一张一张用Photoshop或者L…...
移动端Crash分析:符号化与堆栈追踪的解析
移动端Crash分析:符号化与堆栈追踪的解析 在移动应用开发中,Crash问题直接影响用户体验和产品稳定性。Crash日志往往以难以理解的机器码或内存地址形式呈现,开发者需要通过符号化与堆栈追踪技术将其转化为可读信息。本文将深入解析这一过程&…...
再次革新 .NET 的构建和发布方式(一)氨
本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)。 …...
避坑指南:YooAsset整合HybridCLR时,如何正确处理AOT与热更DLL的打包与加载?
YooAsset与HybridCLR深度整合:AOT与热更DLL的打包加载全解析 当Unity开发者尝试将YooAsset的资源热更新能力与HybridCLR的代码热更新功能结合时,往往会遇到各种"陷阱"。其中最典型的莫过于:明明按照文档将DLL转为.bytes文件&#x…...
【51单片机】【Proteus仿真】 十字路口交通灯系统:从仿真到代码的实战解析
1. 项目背景与核心功能 十字路口交通灯系统是嵌入式开发的经典练手项目,它完美融合了硬件控制、定时器中断和状态机设计三大核心技能。我当年第一次用51单片机做这个项目时,整整调了两天黄灯闪烁频率才稳定下来。这个仿真系统最实用的地方在于࿰…...
ADS1220_WE库详解:工业级24位ADC驱动与高精度传感器采集实现
1. ADS1220_WE 库深度技术解析:面向工业级高精度采集的 24 位四通道 ADC 驱动实现1.1 芯片级定位与工程价值ADS1220 是德州仪器(TI)推出的低功耗、高精度、24 位 Δ-Σ 型模数转换器,专为工业传感器信号调理场景设计。其核心价值不…...
