erase()删除相关问题

来源:10-4 关联容器的插入删除及迭代器失效问题

Mr__Xin

2021-03-07

在删除元素的时候,我发现了两个问题:

  1. 假如现在有三个元素:
  • A: 95.0
  • B: 95.5
  • E: 98.3

我要删除小于98.0分的元素

for (iterator = studentScore.begin(); iterator != studentScore.end(); iterator ++)
     if (iterator->second < 98.0)
          iterator = studentScore.erase(iterator);

结果是只会删除A,而不是A和B:

B: 95.5
E: 98.3

经过调试,发现在删除A后,迭代器更新,指向了B。而后for循环更新,迭代器指向了E,E大于98.0不会被删除。而后退出循环,导致B没有被删除。
但是这种结果显然是错误的,请问如何在使用for循环的前提下解决这个问题呢?


2. 假设现在要删除小于99.0分的元素,也就是说三个元素都要被删除。

for (iterator = studentScore.begin(); iterator != studentScore.end(); iterator ++)
    if (iterator->second < 99.0)
        iterator = studentScore.erase(iterator);

但是结果出错。
经过调试,发现当删除完后,iterator++出错,因为容器已经为空了。
请问这个问题如何在使用for循环的前提下解决呢?

写回答

2回答

quickzhao

2021-03-07

for (iterator = studentScore.begin(); iterator != studentScore.end(); )
    if (iterator->second < 98.0)
         iterator = studentScore.erase(iterator);

    else

         iterator++;

改成这样,你再试试。

1
1
Mr__Xin
非常感谢!
2021-03-11
共1条回复

慕斯7184964

2022-01-18

erase做擦除的时候返回了下一个迭代器iter,那么就不用做自增操作了。

0
1
慕斯7184964
好吧,上面老师回答了 没看到 尴尬
2022-01-18
共1条回复

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3884 学习 · 1103 问题

查看课程