stl中remove和remove_if的陷阱

写程序时遇到这样一个需求: 将map容器中的特定值删除。很容易就想到了remove_if。

remove_if(myMap.begin(), myMap.end(), myCmpfn());

后来发现compile error。那就换最原始的写法,不用remove_if。

for(auto it = myMap.begin; it != myMap.end(); )
{
    if(myCmpfn()(*it))
        myMap.erase(it++);
    else
        ++it;
}

OK,至少编译成功了。回过头来,看看为什么remove_if不行呢?


我们看看remove到底做了什么?


template <class ForwardIterator, class UnaryPredicate>
  ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                             UnaryPredicate pred)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!pred(*first)) {
      *result = std::move(*first);
      ++result;
    }
    ++first;
  }
  return result;
}

哈哈,看源码就明白了,remove_if 函数将不满足删除条件的值,也就是保留值复制到之前删除的位置,并不修改容器size之类的属性。


Effective STL item 9 也有说明: 在删除选项中仔细选择。表示关联容器不能使用remove和remove_if函数,可以使用替代的remove_copy_if函数(虽然这通常不是想要的效果)。


菜鸟还要多多学习STL的使用规范才行啊!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值