C++ STL迭代器失效的情况

面试的时候碰到的一道题,答的稀烂,特意查了一下资料,在此做下总结
其实失效的情况无非是对当前的STL容器进行了修改,这里尤其应该注意这样一个概念,迭代器不能看作是指针,迭代器不能看作是指针,迭代器不能看作是指针,重要的事情说3遍!!!
下面列举一下具体会有问题的情况:
(1)先说删除元素
对于vector和string,删除点之前的迭代器,指针和引用都是有效的,off-the-end迭代器总是失效
对于deque,删除点如果不是front和back,迭代器,指针和引用全部失效,如果删除点是front和back,off-the-end失效,其他的迭代器,指针和引用都有效。
(2)再说一下新增元素
对于vector和string,如果容器内存被重新分配,迭代器,指针和引用全部失效,如果没有重新分配,那么插入点之前的迭代器有效,插入点之后的迭代器失效。
对于deque,插入点如果不是front和back,迭代器,指针和引用全部失效,如果插入点是front和back,off-the-end失效,其他的迭代器,指针和引用都有效。

所以说了这么多,究竟该怎么处理呢?不多废话,直接上代码
删除:

int arr[]={0,1,2,3,4,5,6,7,8,9,10}; 
  vector a(arr,arr+sizeof(arr)/sizeof(*arr));
    for (auto it = a.begin(); it != a.end();){
        if ((*it)&1){
            it=a.erase(it);
        }
        else
            ++it;    
    }

插入:

int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    deque v(arr,arr+sizeof(arr)/sizeof(*arr));
    for (auto it = v.begin(); it != v.end(); )
    {
        if ((*it) & 1)
        {
            it = v.insert(it, *it);
            it += 2;
        }
        else
            it = v.erase(it);
    }

这里还有一点需要注意,别存储off-the-end迭代器,直接利用end()方法获取就好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值