【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 的更多信息,…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...