STL 慎重选择删除元素的方法

假设你有一个容器,Containerc,针对连续内存容器(vector、deque或string),那么最好用erase-remove的习惯用法:

c.erase(remove(c.begin(),c.end(),4),c.end());

对于list,可以采用如下方式:

c.remove(4);

当c为标准关联容器时,例如set,multiset,map或multimap时,使用任何名为remove的操作都是完全错误的,使用remove算法会覆盖容器的值,因此正确的方法是:

c.erase(4);

那么如果有一个判别式,返回true至每个对象,例如:

bool badValue(int x){
   return x>4;
}

对于顺序连续内存容器(vector、deque和string),可采用:

c.erase(remove_if(c.begin(),c.end(),badValue),c.end());

对于list,可采用:

c.remove_if(badValue);

对于关联容器,如何解决该问题,其中一种高效率的方式是:

AssocContainer<int>c;
...
for(AssocContainer<int>::iterator i=c.begin();i!=c.end()){
   if(badValue(*i)) c.erase(i++);
   else ++i;
}

如果需要在循环内进行操作,例如打印操作日志,那么该注意什么?
对于关联容器,直接在上述循环中加入日志写入语句即可:

ofstream logFile;
AssocContainer<int>c;
...
for(AssocContainer<int>::iterator i=c.begin();i!=c.end()){
   if(badValue(*i)) {
   c.erase(i++);
   logFile<<"Erasing"<<*i<<std::endl;
   }
   else ++i;
}

如果是vector、string或deque容器,需要调整下:

ofstream logFile;
SeqContainer<int>c;
...
for(AssocContainer<int>::iterator i=c.begin();i!=c.end()){
   if(badValue(*i)) {
   i=c.erase(i);
   logFile<<"Erasing"<<*i<<std::endl;
   }
   else ++i;
}

一旦erase完成,它指向紧随着被删除元素的下一个元素的有效迭代器。对于list容器,上述两张方式均可以。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值