随笔 - 226,  文章 - 0,  评论 - 4,  阅读 - 30140
  • 前置++表示先对对象加1,然后返回加1后的值
  • 后置++表示先对对象的运算之前的值的副本保存下来,然后对对象加1,然后返回对象运算之前的副本
  • 以上两点可以看出前置++返回的是对象本身,它是一个左值,后置版本返回的是副本它是一个临时量,它是一个右值,因此可以对前置++的结果进行改变,而不可以对后置++的结果进行改变(左值可以改变,可以取地址,右值不可以)
  • 后置++通常运用到容器中,以防访问到不可访问的值
1 //输出vector对象知道遇到第一个负值
2 auto pbeg=v.begin();
3 while(pbeg!=v.end()&&*pbeg>=0)
4     cout<<*pbeg++<<endl;//假定没有负值,pbeg++后已经指向尾后元素但是解引用的是最后一个元素

 

下面给出一段问题代码:

1 for(auto iter=mapTest.begin();iter!=mapTest.end();++iter)//或则iter++
2 {  
3   cout<<iter->first<<":"<<iter->second<<endl;  
4   mapTest.erase(iter);  
5 }

问题在于,容器不可以使用已经删除的元素对应的迭代器,上例中本次循环使用了迭代器删除了其对应的元素,接着对这个删除了的元素的迭代器进行++操作进入了下一次的循环。

解决方法是边删除边后置++

1 for(auto iter=mapTest.begin();iter!=mapTest.end();) //注意此处不能再写iter++  
2 {  
3 cout<<iter->first<<":"<<iter->second<<endl;  
4 mapTest.erase(iter++);  //先将iter运算之前的值的副本保存下来,然后对iter加1,最后将iter运算之前的值返回给函数,实现对迭代器对应位置删除的操作
5 } 

参考文章

c++:map容器中erase()的坑_c++ map erase_网格小生的博客-CSDN博客

 

posted on   小凉拖  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示