- 论坛徽章:
- 0
|
{
return ++timesCalled == 3;
}
private:
size_t timesCalled;
};
假设我们用这个类来从一个vector<Widget>中除去第三个Widget:
vector<Widget> vw; // 建立vector,然后
// 放一些Widgets进去
vw.erase(remove_if(vw.begin(), // 去掉第三个Widget;
vw.end(), // 关于erase和remove_if的关系
BadPredicate()), // 请参见条款32
vw.end());
这段代码看起来很合理,但对于很多STL实现,它不仅会从vw中除去第三个元素,它也会除去第六个!
要知道这是怎么发生的,就该看看remove_if一般是怎么实现的。记住remove_if不是一定要这么实现:
template <typename FwdIterator, typename Predicate>
FwdIterator remove_if(FwdIterator begin, FwdIterator end, Predicate p)
{
begin = find_if(begin, end, p);
if (begin == end) return begin;
else {
FwdIterator next = begin;
return remove_copy_if(++next, end. begin, p);
}
}
这段代码的细节不重要,但注意判断式p先传给find_if,后传给remove_copy_if。当然,在两种情况中,p是传
值——是拷贝——到那些算法中的。(技术上说,这不需要是真的,但实际上,是真的。详细资料请参考条
款38。) |
|