C++ STL容器中循环删除时erase的使用

主要是看不同容器在C++98和C++11的不同表现

序列化容器

C++98和C++11的vector的erase()接口没啥使用区别

从简单的测试例子讲解

vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

删除前的内存

for (vector<int>::iterator iter = vec.begin(); iter != vec.end();)
{
    if (*iter == 2)
    {
        vec.erase(iter++);   //1运行完:iter——0x014E5078
        // iter = vec.erase(iter); //2运行完:iter—0x014E5074
    }
    else
    {
        iter++;
    }
};

执行删除后的内存变化

执行完 2 iter = vec.erase(iter)之后   迭代器的变化

没有具体去看erase()函数的实现,看内存变化,应该是把删除的数据之后的数据整体前移,对应的end()迭代器前移。

1vec.erase(iter++) 为什么不行呢,是因为iter是在原来的迭代器上++,而vector执行erase()之后内存发生变化,导致原有迭代器失效。iter指向和end()一致,异常报错。

序列化容器,erase()会导致原有迭代器失效,循环删除只能使用 iter = vec.erase(iter)

关联性容器

执行erase()之后,关联性容器的迭代器并不失效,所以可以使用map.earse(iter++)

set、map

C++98

map和set的earse()返回值void
只能使用 map.earse(iter++)

C++11

map.earse返回值是删除的迭代器的下一个
所以可以使用 iter = map.earse(iter)
也可以使用 map.earse(iter++)

list

C++98,C++11


返回值是删除的迭代器的下一个:An iterator pointing to the element that followed the last element erased by the function call. This is the container endif the operation erased the last element in the sequence.
两种删除方法都可以
iter = map.earse(iter)
map.earse(iter++)

END


PS: 推荐一个在线C++文档查询网站:STL容器查询

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值