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() ) 的迭代器。 而关于迭代器需要知道的点为

  1. 迭代器不是指针,是类模板,表现的 像 指针。他只是 模拟了指针的一些功能,通过 重载了指针的一些操作符,->,*,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作;
  2. 迭代器返回的是 对象引用而不是对象的值,所以cout只能输出迭代器使用 *取值后的值而不能直接输出其自身。
  3. 在设计模式中有一种模式叫 迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在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.

参考文献

  1. iterator迭代器和指针的区别
  2. stl_vector.h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123579.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python语言:经典例题分析讲解

题1&#xff1a; 通过观察我们可以得出以下结论&#xff1a; 代码实现&#xff1a; """ &#xff08;3&#xff09;输入整数n&#xff0c;输出n行的字符图案。如n5时输出以下图案&#xff1a;* *** ***** ******* *********""""" for…

河南开放大学与电大搜题微信公众号:携手共进,助力学习之路

作为河南省内颇具影响力和声誉的高等教育机构之一&#xff0c;河南开放大学一直致力于提供优质的教育资源和灵活的学习方式&#xff0c;以满足广大学习者的需求。而在这个追求知识的时代&#xff0c;学习者们尤其需要一个便捷、高效的工具来辅助学习。电大搜题微信公众号应运而…

python编程复习系列——week2(Input Output (2))

文章目录 一、多行代码语句二、Escape序列三、字符串格式四、数值运算课后作业 一、多行代码语句 &#x1f95e;使用反斜杠\来表示在下一行中继续使用一条语句。 subject_code "CSCI111" subject_mark 80 subject_grade "D" result "Subject re…

软件测试|黑盒测试方法论-判定表

在因果图分析法中最后会得出一个判定表&#xff0c;可以看出因果图和判定表是有联系的&#xff0c;一般需要结合起来使用。 因果图是一种分析工具&#xff0c;通过分析最终得到判定表&#xff0c;再通过判定表编写测试用例。在一定情况下也可以直接书写判定表&#xff0c;省略…

使用eXplorer本地搭建免费在线文件管理器并实现远程登录——“cpolar内网穿透”

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

Docker 学习路线 13:部署容器

部署容器是使用Docker和容器化管理应用程序更高效、易于扩展和确保跨环境一致性性能的关键步骤。本主题将为您概述如何部署Docker容器以创建和运行应用程序。 概述 Docker容器是轻量级、可移植且自我包含的环境&#xff0c;可以运行应用程序及其依赖项。部署容器涉及启动、管…

设计模式之生产者/消费者模式

文章目录 1. 简介2. 代码实现 1. 简介 生产者消费者模式与保护性暂停模式的GuardObject不同&#xff0c;它不需要产生结果和消费结果的线程一一对应。它使用一个消息队列来平衡生产者和消费者的线程资源。其中生产者仅负责产生结果数据&#xff0c;不关心数据该如何处理&#…

【算法与数据结构】17、LeetCode电话号码的字母组合

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题需要解决的问题有三个&#xff1a; 一、如何实现数字到字母的映射二、如何实现组合问题三、如何解…

基于OpenFOAM求解器二次开发

OpenFOAM&#xff08;Open Field Operation and Manipulation&#xff09;是一个开源的计算流体动力学&#xff08;CFD&#xff09;软件包。它提供了各种模拟和建模工具&#xff0c;用于研究和解决复杂的流体流动问题。 OpenFOAM提供了一个强大的求解器库&#xff0c;可以用于…

边缘计算多角色智能计量插座:用电监测和资产管理的未来智能化引擎

目前主流的智能插座涵盖了红外遥控&#xff08;控制空调和电视等带有红外标准的电器&#xff09;&#xff0c;配备着测温、测湿等仓库应用场景&#xff0c;配备了人体红外或者毫米波雷达作为联动控制&#xff0c;但是大家有没有思考一个问题&#xff0c;就是随着对接的深入&…

汽车标定技术(三)--XCP协议如何支持测量功能

目录 1. 概述 2. 测量方式 -- Poll 3. 测量方式 -- DAQ 3.1 ODT概念模型 3.2 DAQ List概念 3.3 ODT 绝对编号和相对编号 3.4 静态DAQ和动态DAQ模式 &#xff08;1&#xff09;静态DAQ &#xff08;2&#xff09;动态DAQ 4.小结 1. 概述 在该系列的首篇文章汽车标定技…

轻量封装WebGPU渲染系统示例<19>- 使用GPU Compute材质多pass实现元胞自动机之生命游戏(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifeMultiMaterialPass.ts 系统特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调…

苍穹外卖-day06

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 功能实现&#xff1a;微信登录、商品浏览 微信登录效果图&#xff1a; 商品浏览效果图&#xff1a; 1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;…

Busco-真核生物为主基因组质量评估

文章目录 简介Install必须参数谱系数据集输出结果自动谱系选择结果解读完整片段化缺失 自动选择&#xff1a;多domain和污染匹配注意BUSCO报告常用脚本真核Ref 简介 Busco评估基因组质量的核心原理在于通过计算基因组的通用单拷贝标记基因的比例来估计基因组的完整性。其中两个…

SOLIDWORKS 2024新产品发布会暨SOLIDWORKS 创新日活动-硕迪科技

“达索系统SOLIDWORKS 2024新产品发布会暨SOLIDWORKS创新日” 线下发布会即将登场&#xff01;硕迪科技与达索系统携手为您奉上一场“云享未来&#xff0c;智协未来”的创新年度盛会&#xff0c;欢迎莅临&#xff01; SOLIDWORKS 2024 以更加强大的姿态亮相&#xff0c;帮助您…

下载git步骤

文章目录 导文1.软件下载2.git安装3.测试git 导文 下载git的详细步骤 1.软件下载 可以自己去网上下载&#xff0c;根据自己电脑的系统类型是多少位的&#xff0c;去下载对应的安装包。 下载地址&#xff1a;Git - Downloads 根据自己的 操作系统进行选择&#xff0c;按需选择…

学习Nginx配置

1.下载地址 官网地址&#xff1a;NGINX - 免费试用、软件下载、产品定价 (nginx-cn.net) 我这边选择NGINX 开源版 nginx: download 2.nginx的基本配置 配置文件语法 配置文件组成&#xff1a;注释行&#xff0c;指令块配置项和一系列指令配置项组成。 单个指令组成&#x…

计算机丢失mfc100.dll如何恢复,详细解析mfc100.dll文件丢失解决方法

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;比如“mfc100.dll丢失”。这是因为动态链接库&#xff08;DLL&#xff09;文件是Windows操作系统的重要组成部分&#xff0c;它们包含了许多程序运行所需的函数和数据。当这些DLL文件丢失或损坏时&#x…

可持久化01Trie

例题&#xff1a; 解释&#xff1a; 首先这里要求连续异或&#xff0c;所以存储前缀异或和数组。首先的话&#xff0c;我们只考虑前r个版本的Trie&#xff0c;所以以root[r]为根节点的Trie就是1到r位置数。但是&#xff0c;还有一个l左端点&#xff0c;所以我们对于每一个节点…

竞赛选题 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…