【c++初阶]vector 相关的迭代器失效问题

一.前提

        首先我们需要了解vector 的基本结构,vector 内部是由三个迭代来维护的,一个迭代器指向开头,一个指向储存的数据结尾,一个指向这个vector空间的结尾。这里的迭代器其实可以当作原生指针来看。

二.什么情况会出现迭代器失效

普遍来说有两种情形

第一种是插入数据的时候,因为插入的时候势必考虑空间的问题,有可能存在扩容的问题,一但扩容的话,vector会把原来数据挪到新的空间位置,并将原来空间释放,但这时候itarator指向的位置还是原先的空间于是就出现了野指针的问题。

插入数据的时候还有另一种错误,在pos位置插入后,数据产生挪动pos的位置已经不是原来的位置了

第二种是删除数据的时候,代码如下,这种写法在检查比较严格的编译器下可能会报错,例如vs会报断言错误。因为vs在对it进行操作前进行断言强制检查,我们时刻要记住一点就是stl只是一个规范,在不同平台下的实现是不同的。同时这段代码还有一个问题,每次删除掉一个数据后,会越过后面的一个数据,假如删除的数据在结尾,程序就会崩溃。

 

//此代码有问题
auto it = v.begin();
while(it != v.end())
    {
        if( *it % 2 == 0)
        {
            v.earse(it);
        }
       
        
        it++;
        
    }

 

auto it = v.begin();
while(it != v.end())
    {
        if( *it % 2 == 0)
        {
            it = v.earse(it);
        }
       
        else
        {
            it++;
        }
        
    }

 

 因为earse的返回值是下一个元素,所以可以直接将值赋给it,同时删除后不应该进行自增.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值