带你熟练使用list
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中)
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解C++中STL中list
简单使用.
目录
- 前言
- 一、构造函数:
- (1) 无参构造
- (2) 用n个val构造
- (3) 迭代器区间构造
- (4) 拷贝构造
- 二、访问数据
- (1) 迭代器
- (2) Element access:
- 三、修改(重点)
- (1) 头插/删 && 尾插/删
- (2) insert && erase
- 🍔insert
- 🍔erase
- (3) 迭代器失效问题
前言
官方查询文档
本文的目的主要是介绍list
的常用接口,从构造函数,访问数据,修改数据等接口函数介绍.帮助大家初步掌握list
的使用,后续会分享list
的模拟实现,从底层理解list更加深刻的理解list
.
一、构造函数:
函数模型 | 表头 |
---|---|
explicit list(const allocator_type & alloc = allocator_type()); | 无参构造 |
explicit list(size_type n, const value_type & val = value_type()) | n个val初始化 |
list(InputIterator first, InputIterator last) | 迭代器区间初始化 |
list(const list & x); | 拷贝构造 |
学习了string
和vector
这里就不过多介绍了.
(1) 无参构造
测试代码:
void test1()
{//无参构造 explicit list(const allocator_type & alloc = allocator_type());list<int> L1;cout << "L1=";for (auto it : L1){cout << it << " ";}cout << endl;
}
运行结果:
L1=
(2) 用n个val构造
//使用n个val构造 explicit list(size_type n, const value_type & val = value_type())list<int> L2(5,2);cout << "L2=";for (auto it : L2){cout << it << " ";}cout << endl;
运行结果:
L2=2 2 2 2 2
(3) 迭代器区间构造
//迭代器区间构造//template <class InputIterator>//list(InputIterator first, InputIterator last)int arr[] = { 1,2,3,4,5,6,7,8,9,10 };list<int> L3(arr, arr + 10);cout << "L3=";for (auto it : L3){cout << it << " ";}cout << endl;
运行结果:
L3=1 2 3 4 5 6 7 8 9 10
(4) 拷贝构造
//拷贝构造 list(const list & x);cout << "L4=";list<int> L4(L3);//上面的 L3=1 2 3 4 5 6 7 8 9 10for (auto it : L4){cout << it << " ";}cout << endl;
运行结果:
L4=1 2 3 4 5 6 7 8 9 10
二、访问数据
(1) 迭代器
接口名 | 含义 |
---|---|
begin() | 返回第一个有效元素位置的迭代器 |
end() | 返回最后一个有效元素位置的迭代器 |
(2) Element access:
接口名 | 含义 |
---|---|
front() | 返回list的第一个有效结点中存储的值的引用 |
back() | 返回list的最后一个有效节点中存储的值的引用 |
测试代码:
void test2()
{//测试迭代器list<int> L1;L1.push_back(1);L1.push_back(4);L1.push_back(6);L1.push_back(8);L1.push_back(12);L1.push_back(20);list<int>::iterator it = L1.begin();while (it != L1.end()){cout << *it << " ";++it;}cout << endl;//Element access:cout << "front()=" << L1.front() << endl; //返回list的第一个有效结点中存储的值的引用cout << "back()=" << L1.back() << endl; //返回list的最后一个有效节点中存储的值的引用
}
运行结果:
1 4 6 8 12 20
front()=1
back()=20
三、修改(重点)
接口名 | 解释 |
---|---|
push_front | 头插 |
pop_front | 头删 |
push_back | 尾插 |
pop_back | 尾删 |
insert | 在list 中的 pos 位置中插入值为val 的元素 |
erase | 删除list 中的pos 位置的元素 |
swap | 交换两个list |
clear | 清除list中的有效数据 |
(1) 头插/删 && 尾插/删
void test3()
{list<int> L1;L1.push_back(1);L1.push_back(3);L1.push_back(4);L1.push_back(5);L1.push_back(7);L1.push_back(9);for (auto it : L1){cout << it << " ";}cout << endl;//头插 L1.push_front(0);L1.push_front(-1);cout << "依次头插0 和-1后: ";for (auto it : L1){cout << it << " ";}cout << endl;//头删L1.pop_front();cout << "头删一次后: ";for (auto it : L1){cout << it << " ";}cout << endl;//尾删L1.pop_back();L1.pop_back();cout << "尾删两次后: ";for (auto it : L1){cout << it << " ";}cout << endl;
}
运行结果:
1 3 4 5 7 9
依次头插0 和-1后: -1 0 1 3 4 5 7 9
头删一次后: 0 1 3 4 5 7 9
尾删两次后: 0 1 3 4 5
(2) insert && erase
🍔insert
接口名 | 解释 |
---|---|
iterator insert (iterator position, const value_type& val); | 在pos 位置插入值val |
void insert (iterator position, size_type n, const value_type& val); | 在pos 位置开始,插入n 个val |
void insert (iterator position, InputIterator first, InputIterator last); | 在pos 位置插入,一个迭代器区间的值 |
由于list
并不支持下标随机访问元素(" []
"),所以,我们在使用迭代器的时候,避免使用
迭代器+ num
例如:L1.begin()+2
void test4()
{int arr[] = { 1,2,3,4,5,6,7,8 };list<int> L1(arr, arr + 8);for (auto it : L1) //1 2 3 4 5 6 7 8{cout << it << " ";}cout << endl;// insert//iterator insert (iterator position, const value_type& val);\//list的迭代器不支持直接+=num//L1.insert(L1.begin()+2 ,66); //报错auto it1 = L1.begin();++it1;++it1;L1.insert(it1, 66);for (auto it : L1) //1 2 66 3 4 5 6 7 8{cout << it << " ";}cout << endl;//void insert(iterator position, size_type n, const value_type & val);L1.insert(L1.begin(), 3, 0); //在第一个位置插入3个0for (auto it : L1) //0 0 0 1 2 66 3 4 5 6 7 8{cout << it << " ";}cout << endl;//template <class InputIterator>// void insert(iterator position, InputIterator first, InputIterator last);int arr2[] = { -1,-2,-3 };L1.insert(L1.begin(), arr2, arr2+3); //在第一个位置插入一段迭代器区间的值for (auto it : L1) //-1 -2 -3 0 0 0 1 2 66 3 4 5 6 7 8{cout << it << " ";}cout << endl;
}
🍔erase
接口名 | 解释 |
---|---|
iterator erase (iterator position); | 删除该迭代器位置的值 |
iterator erase (iterator first, iterator last); | 删除迭代器区间中的值 |
测试代码:
void test5()
{int arr[] = { 1,2,3,4,5,6,7,8 };list<int> L1(arr, arr + 8);for (auto it : L1) //1 2 3 4 5 6 7 8{cout << it << " ";}cout << endl;//eraseauto it1 = L1.end(); //指向最后一个有效元素的下一个位置--it1; //指向最后一个有效元素的位置--it1; //指向倒数第二个有效元素的位置L1.erase(it1);for (auto it : L1) //1 2 3 4 5 6 8{cout << it << " ";}cout << endl;auto it2 = L1.begin();++it2;auto it3 = L1.end();--it3;L1.erase(it2,it3);for (auto it : L1) //1 8{cout << it << " ";}cout << endl;
}
(3) 迭代器失效问题
猜一猜这段代码的结果是什么?
void test6()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> L1(arr, arr + 10);auto it = L1.begin();auto it2 = L1.end();--it2;while (it != it2){// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,it就失效了L1.erase(it);++it;}cout << endl;
}
解释:
迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list
的底层结构为带头结点的双向循环链表,插入并不会导致扩容而产生迭代器失效问题,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
如下图:
那我该如何解决这个问题呢?
void test6()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };list<int> L1(arr, arr+10);auto it = L1.begin();auto it2 =L1.end();--it2;while (it != it2){it=L1.erase(it);}for (auto it : L1) {cout << it << " ";}cout << endl;
}
下一篇,我们list模拟实现见吧!
相关文章:
带你熟练使用list
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…...
排序——希尔排序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、希尔排序二、希尔排序动态图三、希尔排序程序代码四、希尔排序习题总结 前言 希尔排序定义希尔排序算法分析希尔排序程序代码希尔排序练习题 一、希尔排序…...
为什么文件夹里的文件看不到?了解原因及应对措施
无论是在个人电脑中还是在其他存储介质上,我们经常会遇到文件夹中的文件突然不可见的情况。这种问题给我们的工作和生活带来了不便,并可能导致数据丢失。本文将分析文件夹中文件看不见的原因,并介绍相应的解决方法,以帮助大家更好…...
KVM嵌套虚拟化实现
KVM嵌套虚拟化实现 理论 Libvirt主要支持三种 CPU mode host-passthrough: libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的。但是在热迁移时,它要求目的节点的 CPU 和源节点的…...
驱动开发,IO模型,信号驱动IO实现过程
1.信号驱动IO框架图 分析: 信号驱动IO是一种异步IO方式。linux预留了一个信号SIGIO用于进行信号驱动IO。进程主程序注册一个SIGIO信号的信号处理函数,当硬件数据准备就绪后会发起一个硬件中断,在中断的处理函数中向当前进程发送一个SIGIO信号…...
左神高级进阶班3(TreeMap顺序表记录线性数据的使用, 滑动窗口的使用,前缀和记录结构, 可能性的舍弃)
目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【案例1】 【题目描述】 【思路解析】 这里…...
Linux线程
1.进程是资源管理的最小单位,线程是程序执行的最小单位。 2.每个进程有自己的数据段、代码段和堆栈段。线程通常叫做轻型的进程,它包含独立的栈和CPU寄存器状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包括…...
C++ 太卷,转 Java?
最近看到知乎、牛客等论坛上关于 C 很多帖子,比如: 2023年大量劝入C 2023年还建议走C方向吗? 看了一圈,基本上都是说 C 这个领域唯一共同点就是都使用 C 语言,其它几乎没有相关性。 的确是这样,比如量化交…...
《Java并发编程实战》第2章-线程安全性
0.概念理解 对象状态:存储在状态变量(例如实例或静态域)中的数据; 线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的; 竞态条件&…...
二蛋赠书三期:《C#入门经典(第9版)》
文章目录 前言活动规则参与方式本期赠送书籍介绍作者介绍内容简介读者对象获奖名单 结语 前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术…...
Augmented Large Language Models with Parametric Knowledge Guiding
本文是LLM系列文章,针对《Augmented Large Language Models with Parametric Knowledge Guiding》的翻译。 参数知识引导下的增强大型语言模型 摘要1 引言2 相关工作3 LLM的参数化知识引导4 实验5 结论 摘要 大型语言模型(LLM)凭借其令人印…...
Docker启动Mysql容器并进行目录挂载
一、创建挂载目录 mkdir -p 当前层级下创建 mkdir -p mysql/data mkdir -p mysql/conf 进入到conf目录下创建配置文件touch hym.conf 并把配置文件hmy.conf下增加以下内容使用vim hym.conf即可添加(cv进去就行) Esc :wq 保存 [mysqld] skip-name-resolve character_set_…...
力扣刷题(简单篇):两数之和、两数相加、无重复字符的最长子串
坚持就是胜利 一、两数之和 题目链接:https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应…...
Spark的基础
实训笔记--Spark的基础 Spark的基础一、Spark的诞生背景二、Spark概念2.1 Spark Core2.2. Spark SQL2.3 Spark Streaming2.4 Spark MLlib2.5 Spark GraphX2.6 Spark R 三、Spark的特点3.1 计算快速3.2 易用性3.3 兼容性3.4 通用性 四、Spark的安装部署4.1 Spark的安装部署就是安…...
如何在idea中新建第一个java小程序
如何在idea中新建第一个java小程序 1.打开软件2.新建项目3.找到安装的jdk文件路径4.继续下一步5.创建项目名称并配置项目路径6.点击完成即可。7.在项目文件的src文件夹下创建java类,程序等7.1其他java项目或文件不能运行的原因: 8.新建类并运行程序9.输入…...
AOP全局异常处理
AOP全局异常处理 由于Controller可能接收到来自业务层、数据层、数据库抛出的异常,因此需要使用AOP思想,进行全局异常处理,异常可通过调试获得。 package org.sinian.reggie.common;import lombok.extern.slf4j.Slf4j; import org.springfram…...
一阶低通滤波器滞后补偿算法
一阶低通滤波器的推导过程和双线性变换算法请查看下面文章链接: PLC算法系列之数字低通滤波器(离散化方法:双线性变换)_双线性离散化_RXXW_Dor的博客-CSDN博客PLC信号处理系列之一阶低通(RC)滤波器算法_RXXW_Dor的博客-CSDN博客_rc滤波电路的优缺点1、先看看RC滤波的优缺点…...
JS中Symbol的介绍
1、 引入Symbol类型的背景 ES5 的对象属性名都是字符串,这容易造成属性名冲突的问题 举例: 使用别人的模块/对象, 又想为之添加新的属性,这就容易使得新属性名与原有属性名冲突 2、Symbol类型简介 symbol是一种原始数据类型 其余原始类型: 未定义(undefined) 、…...
封装统一响应结果类和消息枚举类
在开发中,响应结果都需要统一格式,下面给出一个例子,可自行修改。 package com.lili.utils;import com.fasterxml.jackson.annotation.JsonInclude; import com.lili.enums.AppHttpCodeEnum;import java.io.Serializable;/*** author YLi_Ji…...
应广单片机实现红蓝双色爆闪灯
继续进行点灯,今天来点简单的,红蓝双色爆闪灯,上电即可爆闪,红色接pa.3.pa.4,蓝色接pa6.和pa.7,低电平点亮LED灯,想要高电平点亮,或是驱动N管点亮灯,可以稍作修改。端口电平输出0改1,…...
深入了解OSI模型:计算机网络的七大层次
目录 OSI模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 OSI模型 OSI模型是一个网络通信的概念模型,用于描述计算机网络中各个不同层次之间的通信和功能。它将网络通信分为七个不同的层次,每个层次负责不同的任务,使得网…...
games101 作业2
题目 光栅化一个三角形 1. 创建三角形的 2 维 bounding box。 2. 遍历此 bounding box 内的所有像素(使用其整数索引)。然后,使用像素中心的屏幕空间坐标来检查中心点是否在三角形内。 3. 如果在内部,则将其位置处的插值深度值 (…...
二叉树链式存储结构
目录 1.二叉树链式存储结构 2.二叉树的遍历 2.1 前、中、后序遍历 2.2 层序遍历 3.二叉树的其他递归问题 3.1 二叉树的结点个数 3.2 二叉树的叶子结点个数 3.3 二叉树第k层结点个数 3.4 二叉树的深度 3.5 二叉树查找 3.6 二叉树销毁 4.二叉树的基础OJ题 4.1 单值…...
Claude 使用指南 | 可与GPT-4媲美的语言模型
本文全程干货,让你轻松使用上claude,这也是目前体验cluade的唯一途径!废话不多说,直接上教程,cluade的能力不逊于GPT4,号称是ChatGPT4.0最强竞品。相对Chatgpt来说,Claude不仅是完全免费的&…...
【汇编】微处理器
【汇编】微处理器 文章目录 【汇编】微处理器1、微处理器概念1.1 关键词1.2 分类 2、微处理器结构2.1 寄存器2.2 寄存器&汇编助记符2.3 寄存器组成结构 3、地址空间3.1 存储空间3.1.1 虚拟空间(编程空间)3.1.2 线性空间 3.2 I/O空间 4、工作模式4.1 …...
按键点亮led灯
原理图: K0这个按键按下时,开发板D1这个灯亮,松开,灯灭 代码如下: #include "stm32f4xx.h" void LED_Init(void) {//1.定义一个GPIO外设的结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//RCC_AHB1PeriphClockCmd(RCC_AHB1Pe…...
Java常见面试题
目录 1、mysql并发事务会带来哪些问题,如何解决?2、请详细描述Redis持久化机制?3、简述Redis缓存雪崩和缓存穿透的问题和解决方案?4、RabbitMQ消息丢失及对应解决方案5、什么叫线程安全?举例说明6、举例说明常用的加密…...
笔记1.5:计算机网络体系结构
从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体:表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合,协议是水平的。 任一层实体需要使用下层服务,遵循本层…...
【Python】Python 连接字符串应优先使用 join 而不是 +
Python 连接字符串应优先使用 join 而不是 简介 字符串处理在大多数编程程序语言中都不可避免,字符串的连接也是在编程过程中经常需要面对的问题。 Python中的字符串与其他一些程序语言如C、Java有一些不同,它为不 可变对象。 一旦创建便不能改变&…...
uniapp 小程序 父组件调用子组件方法
答案:配合小程序API > this.selectComponent(""),来选择组件,再使用$vm选择组件实例,再调用方法,或者data 1 设置组件的id,如果你的多端,请跟据情况设置ref,class,id,以便通过小…...
北京网站建设资讯/网络营销做得比较好的企业
我们时常会忘记许久之前搁置在冰箱的食物,直到有一天拿出那些已经变了味道的东西,也时常会忘记自己的会员、租约到期了,却忘了续约等等,这样的事情,在我们的生活中屡见不鲜,远不止于此,那究竟该…...
电子商务网站建设人才调研/郑州网站seo公司
一、常用加密情况有三种 : 1. 资源加密,如图片,音乐(防盗版) 2. 网络传输过程中的加密,避免被人拦截并修改数据(防作弊) 3. 游戏数据加密(防作弊) 二、加密…...
北京房山网站建设产品更新培训/广州seo服务
文章目录参考资料1. 问题描述2. 解决方案2.1 将tensorflow降版本2.2 升级python版本参考资料 https://github.com/tensorflow/tensorflow/issues/55440 1. 问题描述 今天我在anaconda虚拟环境中安装好pytorch和tensorflow2.8的gpu版本后,在测试能否使用时报了以下…...
网站建设改手机号/网推平台有哪些比较好
一. 前言我们做开发时经常要用到一些开源代码,比如 cJSON、OpenCV等。cJSON 代码量小,我们可以将其源文件放到我们的工程中。但是对于 OpenCV,由于其代码量很大,我们不方便直接使用其源码,通常情况下我们使用其动态库&…...
网站建设的一般流程排序为/淄博seo怎么选择
在阅读的过程中有不论什么问题,欢迎一起交流 邮箱:1494713801qq.com QQ:1494713801 Services:Cloud Foundry的Service模块从源码控制上看就知道是一个独立的、可Plugin的模块,以方便第三方把自己的服务整合入 CloudFoundry生态…...
做公司+网站建设/最新国际新闻头条今日国际大事件
前言 Access 2007开发指南(修订版)现在,有关Access的好书已经有很多了,我为什么还要写一本呢?这是因为当我在全国各地提供咨询服务时,许多学生都提出下面的看法。现有的Access读本要么针对普通用户群体,要么针对专家级…...