【C++】list的使用
目录
- 1 构造
- 1.1 无参构造
- 1.2 构造的list中包含n个值为val的元素
- 1.3 用[first, last)区间中的元素构造list
- 1.4 拷贝构造
- 2 迭代器的使用
- 2.1 begin + end
- 2.2 rbegin + rend
- 3 容量操作
- 3.1 empty + size
- 4 获取元素
- 4.1 front + back
- 5 插入、删除、修改
- 5.1 头插-push_front和尾插-push_back
- 5.2 头删-pop_front和尾删-pop_back
- 5.3 交换——swap
- 5.4 清理——clear
- 5.5 insert-pos位置插入元素
- 5.6 erase-pos位置删除元素
- 6 迭代器失效问题
list的底层结构是双向循环链表,在任意位置插入和删除效率很高,但是不支持任意位置的随机访问。

下面来介绍一些常用的list接口:
1 构造
1.1 无参构造
list()
list<int> lt;
1.2 构造的list中包含n个值为val的元素
list (size_type n, const value_type& val = value_type())
list<int> lt(6, 77);

1.3 用[first, last)区间中的元素构造list
只要是迭代器都可以在其范围内初始化它的内容
list (InputIterator first, InputIterator last)
list<int> lt1{ 1,2,3,4,5 };list<int> lt2(lt1.begin(), lt1.end());

1.4 拷贝构造
list (const list& x)
list<int> lt1{ 1,2,3,4,5,6,7 };list<int> lt2(lt1);

2 迭代器的使用
2.1 begin + end
返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
list<int> lt{ 1,2,3,4,5,6,7,8,9,10 };
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";++it;
}
cout << endl;

2.2 rbegin + rend
返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置
list<int> lt{ 1,22,3,44,5,6,67,8,91,10 };
list<int>::reverse_iterator it = lt.rbegin();
while (it != lt.rend())
{cout << *it << " ";++it;
}
cout << endl;

3 容量操作
list不需要扩容,它的每个节点是独立的一块空间,根据需求来进行新增节点或者删除节点。
3.1 empty + size
empty :检测list是否为空,是返回true,否则返回false
size:返回list中有效节点的个数
list<int> lt{ 1,2,3,4,5 };
cout << lt.empty() << endl;//0
cout << lt.size() << endl;//5
4 获取元素
4.1 front + back
返回list第一个节点的值和最后一个节点的值
list<int> lt{ 1,2,3,4,5 };
cout << lt.front() << endl;//1
cout << lt.back() << endl;//5
5 插入、删除、修改
5.1 头插-push_front和尾插-push_back
list<int> lt{ 1,2,3,4,5 };
lt.push_front(100);
lt.push_back(1000);
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

5.2 头删-pop_front和尾删-pop_back
list<int> lt{ 1,2,3,4,5 };
lt.pop_front();
lt.pop_back();
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

5.3 交换——swap
list<int> lt1{ 1,2,3,4,5 };list<int> lt2{ 6,7,8,9,10 };lt1.swap(lt2);

5.4 清理——clear
清空有效元素,保留哨兵位节点
list<int> lt{ 1,2,3,4,5 };
lt.clear();
lt.push_back(1);
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

5.5 insert-pos位置插入元素
list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.insert(pos, 100);
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

5.6 erase-pos位置删除元素
list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.erase(pos);
for (auto e : lt)
{cout << e << " ";
}
cout << endl;

6 迭代器失效问题
前面的例子中都只是使用一次,如果重复使用可能会出现迭代器失效问题,先来insert。
list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.insert(pos, 100);
lt.insert(pos, 999);
按正常的思路,第一次在3的前面插入100,第二次在100前面插入999,但是:

list的insert不会出现迭代器失效的问题,但是会出现以上的情况,因为pos指向元素为3的节点,第一次插入是3的前面没有问题,但是第二次插入时pos还是指向元素3,所以插入999还是在元素3的前面插入。
恢复正常逻辑,只需要给pos重新赋值即可。
注:insert和erase是可以有返回值的,返回的是迭代器
pos = lt.insert(pos, 100);
lt.insert(pos, 999);

erase重复使用就会出现因迭代器失效而报错的问题了。
先看代码:
list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.erase(pos);
lt.erase(pos);

因为第一次删除pos位置的节点,该节点已经不存在了,第二次删除还是使用上一次的pos,所以会报错。解决方法就是给pos重新赋值
pos = lt.erase(pos);//下一次如果使用,必须重新赋值
lt.erase(pos);//最后一次使用赋不赋值没有关系

相关文章:
【C++】list的使用
目录 1 构造1.1 无参构造1.2 构造的list中包含n个值为val的元素1.3 用[first, last)区间中的元素构造list1.4 拷贝构造 2 迭代器的使用2.1 begin end2.2 rbegin rend 3 容量操作3.1 empty size 4 获取元素4.1 front back 5 插入、删除、修改5.1 头插-push_front和尾插-push…...
mybatis的缓存机制
视频教程_免费高速下载|百度网盘-分享无限制 (baidu.com) MyBatis 有一套灵活而强大的缓存机制,主要分为两级缓存:一级缓存(本地缓存)和二级缓存(全局缓存)。 一级缓存(本地缓存)&a…...
ChatGLM3报错:No chat template is defined for this tokenizer
使用官方提供的脚本创建ChatGLM3的DEMO: cd basic_demo python web_demo_gradio.py 出现效果异常问题: conversation [{role: user, content: 你好}, {role: assistant, content: 你好,有什么我可以帮助你的吗?\n\n<|im_end|…...
大数据学习之Flink、搞懂Flink的恢复策略
第一章、Flink的容错机制 第二章、Flink核心组件和工作原理 第三章、Flink的恢复策略 第四章、Flink容错机制的注意事项 第五章、Flink的容错机制与其他框架的容错机制相比较 目录 第三章、Flink的恢复策略 Ⅰ、恢复策略 1. Checkpoint: 2. Savepoint&#…...
C语言易忘操作符全集
目录 位操作符 1.按位与(&) 2.按位或(|) 3.按位异或(^) 4.按位取反(~) 5.左移(<<) 6.右移(>>) 逻辑操作符 1.逻辑与(&&) 2.逻辑或(||) 3.逻辑非(!) 位操作符 1.按位与(…...
网络请求 mvp mvvm get post delete put 请求
get 参数拼接 如下接口 localhost:8080/uav/plotting/page/app?pageNum1&pageSize10&appIde3c59e28-2032-4ddf-a762-7cec96f772a4&orgId65&plottingTypepoint GET("https:/uav/plotting/page/app") Observable<PlotList.DataBean> allPoin…...
研究生开题报告撰写:文言一心VSChatgpt3.5
文言一心 问:我是一名研二学生,请帮我生成一份研究生毕设开题答辩ppt框架。 答:好的,以下是一份研究生毕设开题答辩PPT的框架,供您参考: 幻灯片1:封面页 标题:研究生毕设开题答辩…...
Unity animator动画倒放的方法
在Unity中, 我们有时候不仅需要animator正放的效果,也需要倒放的效果。但我们在实际制作动画的时候可以只制作一个正放的动画,然后通过代码控制倒放。 实现方法其实很简单,只需要把animator动画的speed设置为-1即为倒放ÿ…...
Dubbo源码解析第一期:如何使用Netty4构建RPC
一、背景 早期学习和使用Dubbo的时候(那时候Dubbo还没成为Apache顶级项目),写过一些源码解读,但随着Dubbo发生了翻天覆地的变化,那些文章早已过时,所以现在计划针对最新的Apache Dubbo源码来进行“阅读理解…...
unity刷新grid,列表
获取UIGrid 组件,更新列表 listParent.GetComponent().repositionNow true;...
蓝桥杯备赛 day 3 —— 高精度(C/C++,零基础,配图)
目录 🌈前言: 📁 高精度的概念 📁 高精度加法和其模板 📁 高精度减法和其模板 📁 高精度乘法和其模板 📁 高精度除法和其模板 📁 总结 🌈前言: 这篇文…...
人形机器人创新发展顶层设计与关键技术布局
系列文章目录 前言 随着新一轮科技革命和产业变革的深入推进,我国高度重视人形机器人的创新发展,提出了一系列具有前瞻性和战略性的指导意见。规划指出,到2025年,我国将初步建立人形机器人创新体系,攻克“大脑”、“小…...
C语言-算法-最小生成树
【模板】最小生成树 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。 输入格式 第一行包含两个整数 N , M N,M N,M,表示该图共有 N N N 个结点和 M M M 条无向边。 接下来 M M M 行…...
android 扫描某个包下的所有类
注意事项 如果在用Android Studio开发过程中,如果新增了类,扫描不到。只能把APP卸载了,才能扫描到。 可能是Instance Run 的影响。 后面研究一下这篇文章,看看能不能解决 Android 遍历Apk下的所有类文件 package com.trs.nmip.…...
远程ssh 不通的原因之一
背景:我都想大喊一声,我上网是通的, ping网址是通的,ping www.baidu.com 是通的, 怎么都远程不了,报超时;嘿, 别人远程就能行。我都想挠头了。 目录 1. 先 ping 自己,…...
wamp集成环境部署
Windows下Apache服务器搭建 第一步:下载Windows下的最新ZIP压缩包 推荐下载网址:http://www.apachelounge.com/download/ 为了让Apache服务器发挥更好的性能,请根据自己的系统选择下载,如果不清楚自己的系统是64位还是32位&am…...
使用antd design pro 及后端nodejs express 结合minio进行文件的上传和下载管理
使用Ant Design Pro前端框架结合Node.js Express后端服务以及MinIO作为对象存储,实现文件上传和下载管理的基本步骤如下: 1. 安装所需依赖 在Node.js Express项目中安装minio客户端库: npm install minio --save 在前端项目(假…...
Unity常用的优化技巧集锦
Unity性能优化是面试的时候经常被问道的一些内容,今天给大家分享一些常用的Unity的优化技巧和思路,方便大家遇到问题时候参考与学习。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游…...
c++动态调用dll
在C中动态调用DLL(动态链接库)可以使用Windows API函数。以下是一个简单的示例,演示如何动态加载和调用DLL中的函数: #include <windows.h> #include <iostream>int main() { // 加载DLL HMODULE hModule LoadLibrar…...
使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等
使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 此自动化脚本将帮助你使用 Python 中的 Android 调试桥 (ADB) 自动化你的智能手机。下面我将展示如何自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 您可以了解有关 ADB 的更多信息,…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...


