vector<int>Vect;

	Vect.insert(Vect.begin()+2, 50);

	for (auto it=Vect.begin();it!=Vect.end();++it)
{ if (*it==50)
{
Vect.erase(it); } }

为什么以上的代码会报错,而下面的一段代码不会报错?

	vector<int>Vect;

    Vect.insert(Vect.begin()+2, 50);

	for (auto it=Vect.begin();it!=Vect.end();++it)
{
if (*it==50)
{
it = Vect.erase(it);
} }

原因:从容器中删除(erase)一个元素时,被删除元素的迭代器(以及所有后续元素的迭代器)会变成失效状态。这意味着,如果您尝试在 erase 操作后继续使用原迭代器进行循环迭代,您将使用一个已经失效的迭代器。这种行为是未定义的,可能导致运行时错误或程序崩溃。

当执行 Vect.erase(it) 后,it 已经失效,因此无法安全地执行 ++it 进行下一次循环迭代。

代码更改后:

这样处理因为 erase 方法返回一个指向被删除元素下一个元素的迭代器。这意味着,it 立即更新为一个有效的迭代器,指向下一个元素,或在删除末尾元素时指向 Vect.end()。这样,您就能安全地继续循环,因为确保了每一步都在使用有效的迭代器。

这是处理这类问题的一种常见方法,确保了迭代器在任何时候都是有效的,避免了未定义行为的风险。

修正后的循环正确处理了迭代器的更新,从而避免了在删除元素后继续使用失效迭代器的问题。

vector的Erase相关的更多相关文章

  1. map 和 vector 的erase函数说明

    1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: (1) void erase (it ...

  2. BZOJ 2878([Noi2012]-失落的游乐园树DP+出站年轮加+后市展望DP+vector的erase)

    2878: [Noi2012]迷失乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved:  ...

  3. 【转】vector中erase()的使用注意事项

    vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Whe ...

  4. 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论

    关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论 1.前言: 最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合 ...

  5. vector数组的相关知识

    Vector 类实现了一个动态数组.和 ArrayList 很相似,但是两者是不同的: Vector 是同步访问的. Vector 包含了许多传统的方法,这些方法不属于集合框架. Vector 主要用 ...

  6. vector的erase的用法

    vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6); 可以直接从begin进行加减,比如我们要移除第3个 ...

  7. vector 内存释放相关

    在使用vector 存储char 类型时 new的数据 在vecto 执行rerase的时候或者 单项执行clear 内存是不能被释放的. 比如有下面的一个测试: class SnapshotInfo ...

  8. vector中erase用法注意事项

    以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...

  9. vector之erase和迭代器

    C++开发中使用vector时非常方便的,但是也是需要非常小心的,最近在使用容器删除某个元素的时候,测试结果出现了异常 /* vector erase test*/ int testVector() ...

  10. vector中erase()与insert()用法

    erase()用法:https://blog.csdn.net/duan19920101/article/details/50717748 注:erase是删除指定位置的元素,不能删除给定元素值.若要 ...

随机推荐

  1. TPCH-PostgreSQL生成数据集并导入数据表

    1.数据集下载 TPC-H数据集: https://github.com/gregrahn/tpch-kit 2.解压安装 unzip  tpch-kit-master.zip cd tpch-kit ...

  2. Linux-RAID类型介绍、创建、彻底删除

    一.RAID(磁盘阵列) 1.1.RAID概念 RAID简称为独立冗余磁盘阵列,把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术, ...

  3. 从零开始的react入门教程(四),了解常用的条件渲染、列表渲染与独一无二的key

    壹 ❀ 引 在从零开始的react入门教程(三),了解react事件与使用注意项一文中,我们了解了react中事件命名规则,绑定事件时对于this的处理,以及事件中可使用的e对象.那么这篇文章中我们来 ...

  4. 轻松玩转makefile | 变量与模式

    前言 本文通过简单的几个示例,以及对同一个Makefile进行几个版本的迭代,帮助快速的理解变量和模式规则的使用. 1.回顾 在上一篇文章中,我们使用Makefile编译fun.c和main.c这两个 ...

  5. Ehcache 3.x 笔记

    现在Ehcache版本已经到3.10了, 网上查到的大部分还是2.x版本的使用说明, 把基础用法记了一下, 以后有时间再翻译. 基础使用, 创建 CacheManager CacheManager c ...

  6. Swoole从入门到入土(28)——协程[核心API]

    本节专门介绍swoole提供的协程机制中核心的API 类方法: 1) set():协程设置,设置协程相关选项. Swoole\Coroutine::set(array $options); 2) ge ...

  7. Swoole从入门到入土(19)——WebSocket服务器[文件传输]

    要利用WebSocket进行文件传输,我们需要讨论两种情况,分别是:发送方可以是客户端,和 发送方是服务端. 1.发送方是客户端  1)服务端接收 $server->on('message', ...

  8. maven打包时打包指定的lib文件夹

    今天在打包自己的spring boot项目时遇到了问题, 报找不到类和符号. 因为我有些依赖是放在项目lib文件夹中,那么打包的时候要连把它一起打包. 修改pom.xml, 添加一下内容: <b ...

  9. Android里使用AspectJ实现AOP

     前言 Aspectj提供一种在字符串里编程的模式,即在字符串里写函数,然后程序启动的时候会动态的把字符串里的函数给执行了. 例如: "execution(* *(..))" 这里 ...

  10. win32 - Screen to bmp file(BYTE)

    void WINAPI CaptureScreenIntoFile() { BITMAPFILEHEADER bfHeader; BITMAPINFOHEADER biHeader; HGDIOBJ ...