关于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);
}

}





...全文
110 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xbs_l 2009-05-12
  • 打赏
  • 举报
回复
那是不是可以这样说:
在我们调用的实作_P(*_F) 版本中,_P被调用了两次

lingyin55 2009-05-12
  • 打赏
  • 举报
回复
标准没有规定的东西,要怎么实现都可以。

[Quote=引用 3 楼 xbs_l 的回复:]
但是在find_if()算法中怎么被调用了两次,不懂?
[/Quote]
xbs_l 2009-05-12
  • 打赏
  • 举报
回复
但是在find_if()算法中怎么被调用了两次,不懂?
taodm 2009-05-12
  • 打赏
  • 举报
回复
因为标准没规定这个细节。
liliangbao 2009-05-12
  • 打赏
  • 举报
回复
帮顶~~~

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧