迭代器删除操作写法及解释

1 迭代器是什么?

迭代器是一种典型的设计模式,与集合配套使用,其目的是隐藏集合中的内部成员,并且提供对集合成员的访问能力。其结构如下图所示;

Iterator Pattern

具体协作关系及实现方式,就不在此赘述了。

 

2 在迭代器上执行删除操作

下面以删除list中所有给定值的元素为例,介绍迭代器的一种常见写法及原理解释。

错误写法:

[cpp]  view plain copy
  1. std::list<int>::iterator it = listVar.begin();  
  2. while(it != listVar.end())  
  3. {  
  4.     // 相等,则删除当前位置并后移  
  5.     if (*it == iVar)  
  6.     {  
  7.         listVar.erase(it); // 删除当前位置  
  8.         it++; // 向后移动  
  9.     }  
  10.     // 不相等,则向后移动  
  11.     else  
  12.     {  
  13.         it++;  
  14.     }  
  15. }  
在erase之后,迭代器已变为无效,因此再执行++操作,其行为是未定义的。


正确写法一:

[cpp]  view plain copy
  1. std::list<int>::iterator it = listVar.begin();  
  2. std::list<int>::iterator = listVar.end();  
  3. while(it != listVar.end())  
  4. {  
  5.     // 相等,则删除当前位置并后移  
  6.     if (*it == iVar)  
  7.     {  
  8.         itNext = it;  
  9.         itNext++; // 先获取到当前位置的下一个位置  
  10.         listVar.erase(it); // 删除当前位置  
  11.         it = itNext; // 将下一个位置赋值给it  
  12.     }  
  13.     // 不相等,则向后移动  
  14.     else  
  15.     {  
  16.         it++;  
  17.     }  
  18. }  

在删除指定位置前,此时迭代器是有效的,先获取其下一个位置,然后删除当前位置,最后再将下一位置赋值给当前迭代器。这个方法是可行的,但是写法很冗余,其实这几步,一行就可以搞定


正确写法二:

[cpp]  view plain copy
  1. while(it != listVar.end())  
  2. {  
  3.     // 相等,则删除当前位置并后移  
  4.     if (*it == iVar)  
  5.     {  
  6.         listVar.erase(it++); // 删除当前位置并后移  
  7.     }  
  8.     // 不相等,则向后移动  
  9.     else  
  10.     {  
  11.         it++;  
  12.     }  
  13. }  
这种写法也是一种很典型的用法。

相信大家在平时写代码时也都是这么用的,但为什么这样写可行,可能有些同学就说不清楚了。

首先,it++是一个函数调用,其调用的函数为迭代器的operator++()方法,该方法将迭代器自身向后移动一个位置,同时其返回当前位置。

然后,erase执行时,传递进来的迭代器是当前位置的拷贝的一个临时迭代器,而it此时已经指向下一个位置了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值