迭代器失效问题

在序列容器里,删除了当前的iterator 导致后边所有元素的迭代器都会失效   增加一个元素也会导致后边的元素进行移动
       因为vector、deque是序列容器,使用连续分配的内存,删除当前元素,后边的所有元素都会向前移动一个位置,之后数据的地址发生了变化,之前的迭代器根据原有容器的信息访问不到正确的内容。

使用earse方法删除元素的时候 erase方法会返回下一个元素的迭代器(有效);用迭代器iterator 来接收返回后新的迭代器的值。

#if 1
#include <iostream>
#include <vector>
#include <deque>
using namespace std;

int main()
{
    vector<int> deque1;
    for(auto i = 0; i < 6; ++i)
    {
        deque1.push_back(i);
    }

    auto it = deque1.begin();
    for(; it != deque1.end();)
    {
        if(*it > 2)
            it = deque1.erase(it);   //会返回迭代器的下一个值
        else
            it++;
    }
    it = deque1.begin();
    for(; it != deque1.end(); ++it)
    {
        cout << *it << endl;
    }
    return 0;
}
#endif

 

在关联容器里: set    map   multimap  multiset

删除了当前的迭代器,会使当前的迭代器失效,因为这类容器底层使用红黑树实现的,红黑树的特点 插入、删除节点对其他节点不会造成影响, 删除了当前的迭代器,当前的迭代器会失效,即迭代器进行++自增操作会出现问题,所以在迭代器失效之前先对迭代器进行自增操作。

Map.erase(it++);

在这个语句里:把it自增之前的值传递到eraser方法里,然后it迭代器自增,自增之后执行eraser方法,自增之前的迭代器就已经失效了。

 

list容器同关联容器一样。 是不连续的内存,处理迭代器失效的问题,处理方法也一样。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值