请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

迭代器失效问题

图片描述
老师,您好,这个是运行的您的示例代码,如果将while循环注释掉,下面的for循环就会报迭代器失效问题,如上图
还有,如果将while循环中的if (iter->second < 98.0) 改为if (iter->second < 95.0),则for循环中过滤出的数据错误,没有将LiMing: 95擦除,如下图
图片描述

正在回答

1回答

和while循环没有关系。你最后一个for循环里的if判断有问题。这时迭代器时效了,必须要更新,你前面那个for循环是对的。然后你的iter++操作要注意,避免重复更新iter,否则会跳过一些元素,导致你说的部分满足条件的元素没被删除。你试试下面的代码。

for (iter = student.begin(); iter != student.end(); )

{

     if (iter->second < 98.5)

    {

        iter = student.erase(iter);

    }

    else

    {

        iter++;

    }

}


0 回复 有任何疑惑可以回复我~
  • 提问者 慕妹4782275 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-01-26 18:51:34
  • 提问者 慕妹4782275 #2
    老师,您好。你提供的改进方法,我验证了,是可以的。但是我还是不明白,为啥原有for循环中的if写法,如下
    for (iter = studentSocres.begin(); iter != studentSocres.end(); iter++)
    	{
    		if (iter->second <= 98.5)
    		{
    			iter = studentSocres.erase(iter);  
    		}
    	}
    在上面while循环存在的情况下,运行正常;但是如果注释while循环后,会报迭代器失效的问题呢?是while循环不经意做了什么事情,弥补了for循环中的问题吗?谢谢。
    回复 有任何疑惑可以回复我~ 2021-01-26 18:56:37
  • quickzhao 回复 提问者 慕妹4782275 #3
    你的代码中iter++在if满足时会多执行一次迭代器的跳转,这是问题所在。我没看你while循环,这个你可以自己调试下看看哪里有问题。
    回复 有任何疑惑可以回复我~ 2021-01-27 16:09:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信