C++ vector 动态数组的指定元素删除
文本旨在对 C++ 的容器 vector 进行肤浅的分析。
文章目录
- Ⅰ、vector 的指定元素删除
- 代码
- 结果与分析
- Ⅱ、vector 在新增元素后再删除指定元素
- 代码
- 结果与分析
- Ⅲ、vector 在特定条件下新增元素
- 代码
- 结果与分析
- 参考文献
Ⅰ、vector 的指定元素删除
代码
#include <iostream>
#include <vector>using namespace std;int main() {std::vector<int> v = {8, 5, 6, 2, 4, 7};for (auto i = v.begin(); i != v.end();) {cout << i.base() << " " << v.begin().base() << endl;if (*i == 2) {i = v.erase(i);} else {i++;}}cout << "size : " << v.size() << endl;for (auto j = v.begin(); j != v.end(); j++) {cout << (*j) << endl;}
}
结果与分析
先说明一下 vector.erase() 就是动态数组的指定位置的删除,其返回值为指向下一个元素( 或 end() ) 的迭代器。 而关于迭代器需要知道的点为
- 迭代器不是指针,是类模板,表现的 像 指针。他只是 模拟了指针的一些功能,通过 重载了指针的一些操作符,->,*,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作;
- 迭代器返回的是 对象引用而不是对象的值,所以cout只能输出迭代器使用 *取值后的值而不能直接输出其自身。
- 在设计模式中有一种模式叫 迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过 迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。
这也就是下面 vector v 的首地址为72b0,每次进行 i++ ,其基地址就加了 4 ,一个 int 的字节量。而在删除了 元素 2 之后,迭代器的值仍然为 72bc,但是在删除之后这个值志向了元素 4。完美的解释了代码。那么问题的出现请看第二节。
Ⅱ、vector 在新增元素后再删除指定元素
代码
#include <iostream>
#include <vector>using namespace std;int main() {std::vector<int> v = {8, 5, 6, 2, 4, 7};for (auto i = v.begin(); i != v.end();) {// cout << i.base() << " " << v.begin().base() << endl;if (*i == 8) {v.push_back(88);i = v.erase(i);} else {i++;}}cout << "size : " << v.size() << endl;for (auto j = v.begin(); j != v.end(); j++) {cout << (*j) << endl;}
结果与分析
此时在添加了一个新的元素后,再进行删除操作会发生段错误。而且为什么会有两个88。这就是我遇见的问题所在。虽然用 int + vector 和 打印地址的方式可以很快地发现问题。但我面对的是 vector<expr *>呀,。。。这么来看,我好想确实有苦说不出阿。没办法,🥬是这样的,唉。
而且一般来说,也没人会打印迭代器的基地址。虽然打印了问题就能一目了然了,但我是煞笔 此时为什么会有两个88,而且元素 5 去哪了。这就是问题的所在了。但是答案其实就在 vector 的定义和名称中,动态数组 。最后答案的揭晓在第三节。
Ⅲ、vector 在特定条件下新增元素
代码
#include <iostream>
#include <vector>using namespace std;int main() {std::vector<int> v = {8, 5, 6, 2, 4, 7};for (auto i = v.begin(); i != v.end();) {cout << i.base() << " " << v.begin().base() << endl;if (*i == 8) {v.push_back(88); i++;} else {i++;}}cout << "size : " << v.size() << endl;for (auto j = v.begin(); j != v.end(); j++) {cout << (*j) << endl;}
结果与分析
最开始 v 的首地址为b2b0,但是在添加了一个元素之后其首地址发送了改变,aka 内存发现了一片新的区域来更合适的存储这个数组,从而动态地发生了改变。但是此时我们设定的迭代器并未改变。可以看出在进行了 275 次自加操作后,迭代器才完成了对于新数组的访问。
结尾处 的来两个88也很好解释了,在最开始的 元素8 处,向数组中添加了一个 88。从而导致了数组 v的内存地址发生了改变。在经历了漫长的自加操作后,迭代器 i 又找到了一个元素 8,就又添加了一个新的元素 88。
至此问题结束,数组动态地删除指定元素的模板就是第一节的代码,不要在删除的过程中添加新的元素,反之亦然!!!。希望可以帮到你,wish u all the best.
参考文献
- iterator迭代器和指针的区别
- stl_vector.h
相关文章:

C++ vector 动态数组的指定元素删除
文本旨在对 C 的容器 vector 进行肤浅的分析。 文章目录 Ⅰ、vector 的指定元素删除代码结果与分析 Ⅱ、vector 在新增元素后再删除指定元素代码结果与分析 Ⅲ、vector 在特定条件下新增元素代码结果与分析 参考文献 Ⅰ、vector 的指定元素删除 代码 #include <iostream&g…...

Python机器学习算法入门教程(第四部分)
接着Python机器学习算法入门教程(第三部分),继续展开描述。 十九、信息熵是什么 通过前两节的学习,我们对于决策树算法有了大体的认识,本节我们将从数学角度解析如何选择合适的“特征做为判别条件”,这里…...

Ubuntu中安装rabbitMQ
一、安装 RabbitMQ ①:更新源 sudo apt-get update②:安装Rrlang语言 由于RabbitMq需要erlang语言的支持,在安装RabbitMq之前需要安装erlang sudo apt-get install erlang-nox③:安装rabbitMQ sudo apt-get install rabbitmq-s…...

Langchain-Chatchat实践详解
简介 本质上是在Langchain基础上封装的一层聊天服务,可以对接底层多种离线LLM和在线的LLM(也可以对接自定义的在线LLM)。提供基于知识库聊天功能相关的一系列API。 下载源码 源码地址: https://github.com/chatchat-space/Lang…...
python求解优化问题的几个例子
目录 1、最优化问题 2、线性规划 3、无约束优化 3.1单变量 3.2多变量 1、最优化问题 使用scipy库中的minimize函数来求解最优化问题。在这个例子中,我们定义了一个目标函数 objective,其形式为x1^2 x2^2;以及一个约束条件 constraint&…...

HP惠普暗影精灵9P OMEN 17.3英寸游戏本17-cm2000(70W98AV)原装出厂Windows11-22H2系统镜像
链接:https://pan.baidu.com/s/1gJ4ZwWW2orlGYoPk37M-cg?pwd4mvv 提取码:4mvv 惠普暗影9Plus笔记本电脑原厂系统自带所有驱动、出厂主题壁纸、 Office办公软件、惠普电脑管家、OMEN Command Center游戏控制中心等预装程序 所需要工具:3…...
❤ Uniapp使用Ucharts(二)(组件类型)
❤ Uniapp使用Ucharts(二)(秋云组件类型) 一、折线图 1、结构 <template><view class"charts-box"><qiun-data-charts type"area":opts"opts":chartData"chartData"/&…...

Linux Vim批量注释和自定义注释
使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。连续行的注释其实可以用替换命令来完成。 换句话说,在指定…...

虚幻C++基础 day3
常见的游戏机制 Actor机关门 创建一个Actor类,添加两个静态网格与一个触发器 UBoxComponentUStaticMeshComponent 头文件: #include “Components/BoxComponent.h”#include “Components/StaticMeshComponent.h” TriggerDoor.h // Fill out your …...

第26期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…...

(动手学习深度学习)第7章 稠密连接网络---DenseNet
目录 DenseNetDenseNet的优点:DenseNet的改进思路总结 DenseNet代码实现 DenseNet DenseNet的优点: 省参数。在 ImageNet 分类数据集上达到同样的准确率,DenseNet 所需的参数量不到 ResNet 的一半。对于工业界而言,小模型可以显著…...

UART编程(寄存器)
1. 串口编程步骤 1.1 看原理图确定引脚 有很多串口,使用哪一个?看原理图确定 1.2 配置引脚为UART功能 至少用到发送、接收引脚:txd、rxd 需要把这些引脚配置为UART功能,并使能UART模块 1.3 设置串口参数 有哪些参数…...

事务码增删查改表数据
常用事务码 SE11 SE14 SE16 SE16N SM30 SE11:查看数据库表/修改表中字段数量_类型/查看表中数据/设置表为可维护或不可维护 SE14:查看数据库表的创建日期创建用户名/查看表中字段/删除表中全部数据(只能全部删) SE16:查看数据库表/对可维护数据库表进行数据维护/SE16通过调试…...

vue开发环境搭建部署(mac版)
前言 目前后端工作越来越少了,年底了,为了先过验收。项目负责人、产品、需求制定的方案就是先做假页面,所以前端的活多点。 其实现在不喜欢搞前端,原因很多,但是感觉现在似乎流行的码林绝学又是九九归一的瓶颈期…...
Java【算法 05】通过时间获取8位验证码(每两个小时生成一个)源码分享
通过时间获取验证码 1.需求2.代码实现2.1 依赖2.2 时间参数处理方法2.3 截取验证码方法2.4 验证方法 3.总结 1.需求 要求是很简单的,每个验证码的有效时间是2小时,这个并不是收到验证码开始计时的,而是每个两小时的时间段使用的是相同的验证…...

微服务 Spring Cloud 5,一图说透Spring Cloud微服务架构
目录 一、域名系统DNS二、LVS(Linux Virtual Server),Linux虚拟服务器三、CDN静态资源四、Nginx反向代理服务器1、Nginx的主要作用体现在以下几个方面:2、Nginx静态资源服务和CDN静态资源服务,如何选择? 五、Gateway网…...

conda清华源安装cuda12.1的pytorch
使用pytorch官方提供的conda command奇慢无比,根本装不下来(科学的情况下也这样) 配置一下清华源使用清华源装就好了 清华源:https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ 配置方法:conda config --…...

安徽首届道医传承十八绝技发布会在合肥成功举办
近日,在安徽合肥举行了首届道医传承十八绝技发布会,本次会议由安徽渡罗门生物科技有限公司、北京道武易医文化传播有限公司、楼观台道医文化研究院联合举办。现场吸引了来自全国各地民族医学领域的专家学者参与讨论与交流。本次会议旨在促进道医的交流与…...

一款功能强大的web目录扫描器专业版
dirpro 简介 dirpro 是一款由 python 编写的目录扫描器,操作简单,功能强大,高度自动化。 自动根据返回状态码和返回长度,对扫描结果进行二次整理和判断,准确性非常高。 已实现功能 可自定义扫描线程 导入url文件进…...

【Linux网络】网卡配置与修改主机名,做好基础系统配置
目录 一、网络配置命令 1、查看网卡信息ifconfig Linux永久修改ip地址 2、主机名修改 ①hostname 临时修改主机名 ②永久修改主机名 第一种,使用命令修改 第二种:修改配置文件 3、路由信息 再来拓展一下,永久修改路由表信息 4、检查…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

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);…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...