写程序时遇到这样一个需求: 将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的使用规范才行啊!