关于remove_if的实作版本,高手能解答下吗?
xbs_l 2009-05-12 09:50:33 template<class ForwIter, class Predicate>
ForwIter std::remove_if(ForwIter beg, ForwIter end,
Predicate op)
{
beg = find_if(beg, end, op);
if (beg == end)
{
return beg;
}
else
{
ForwIter next = beg;
return remove_copy_if(++next, end, beg, op);
}
}
在上一个实作版本中op怎么被find_if算法调用了两次??
find_if算法在include文件中的声明如下:
template<class _II, class _Pr> inline
_II find_if(_II _F, _II _L, _Pr _P)
{for (; _F != _L; ++_F)
if (_P(*_F))
break;
return (_F); }
在另一个实作版本中却不被调用两次?如下:
template <class ForwIter, class Predicate>
ForwIter std::remove_if(ForwIter beg, ForwIter end,
Predicate op)
{
while (beg != end && !op(*beg))
{
++beg;
}
if (beg == end)
{
return beg;
}
else
{
ForwIter next = beg;
return remove_copy_if(++next, end, beg, op);
}
}