vector使用详解之erase()

一、erase()函数的概述

erase()函数是vector容器的一个成员函数,用于删除(擦除)某些元素。该函数有两个参数:要删除元素的迭代器范围。如果只提供一个迭代器,则被删除的是该迭代器所指向的元素。


vector v{ 1, 2, 3, 4, 5 };
v.erase(v.begin() + 2);

上面这个例子,将删除v中的第3个元素。

二、erase()函数的使用方法

1、擦除单个元素

如果只需要删除一个元素,则可直接指定该元素在vector中的迭代器。


vector v{ 1, 2, 3, 4, 5 };
auto it = v.begin();
++it;
v.erase(it);

上面这个例子,将擦除v中的第2个元素。

2、擦除一个范围的元素

如果需要擦除多个元素,则需指定要删除的元素范围,即两个迭代器之间的范围。


vector v{ 1, 2, 3, 4, 5 };
auto it1 = v.begin() + 1;
auto it2 = v.begin() + 3;
v.erase(it1, it2);

上面这个例子,将擦除第2个到第4个元素。

三、erase()函数的实现原理

erase()函数实际上是通过调用底层元素的析构函数来移除元素,并由容器对象的内部实现机制自动维护容器大小和内存空间。在擦除元素之后,原来位于该元素之后的所有元素都将向前移动一个位置。


vector v{ 1, 2, 3, 4, 5 };
auto it = v.begin() + 1;
v.erase(it);

上面这个例子,将删除v中的第2个元素。擦除过程如图:

擦除范围时,底层元素将被逐个析构,并向前移动,以填补擦除的空间。


vector v{ 1, 2, 3, 4, 5 };
auto it1 = v.begin() + 1;
auto it2 = v.begin() + 3;
v.erase(it1, it2);

上面这个例子,将擦除第2个到第4个元素。擦除过程如图:

四、erase()函数的注意事项

1、迭代器失效问题

使用erase()函数擦除元素时,要注意迭代器失效的问题。


vector v{ 1, 2, 3, 4, 5 };
auto it = v.begin() + 1;
v.erase(it);
v.erase(it); // 迭代器it已失效

上面这个例子中,第二次使用erase()函数时,迭代器it已失效,会产生未定义的行为。正确的做法是重新获取迭代器。


vector v{ 1, 2, 3, 4, 5 };
auto it = v.begin() + 1;
v.erase(it);
it = v.begin() + 2;
v.erase(it);

2、擦除空vector

当vector为空时,调用erase()函数是未定义的行为。


vector v;
v.erase(v.begin()); // 未定义的行为

应该在使用erase()函数前,先判断vector是否为空。


vector v;
if (!v.empty()) {
    v.erase(v.begin());
}

3、使用remove或remove_if算法删除元素

当需要删除不连续的元素时,建议使用remove或remove_if算法。


vector v{ 1, 2, 3, 4, 5 };
v.erase(remove(v.begin(), v.end(), 2), v.end());

上面这个例子中,将删除v中值为2的元素。remove算法将需要保留的元素移动到vector的前面。返回值为新的结束迭代器,表明保留元素的范围。erase()函数用来删除不需要保留的元素。

五、总结

erase()函数是vector容器的一个成员函数,用于删除(擦除)某些元素。它有两个参数:要删除元素的迭代器范围。如果只提供一个迭代器,则被删除的是该迭代器所指向的元素。在擦除元素之后,原来位于该元素之后的所有元素都将向前移动一个位置。使用erase()函数擦除元素时,要注意迭代器失效和空vector问题。当需要删除不连续的元素时,建议使用remove或remove_if算法。

原创文章,作者:VUGS,如若转载,请注明出处:https://www.506064.com/n/136068.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VUGSVUGS
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相关推荐

  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25

发表回复

登录后才能评论