先贴代码:
template <class _ForwardIterator, class _Predicate>
_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
{
__first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
(__first, __last, __pred);
if (__first != __last)
{
_ForwardIterator __i = __first;
while (++__i != __last)
{
if (!__pred(*__i))
{
//如果不符合条件就把后面的数据往前移,覆盖符合条件的元素
*__first = _VSTD::move(*__i);
++__first;
}
}
}
return __first;
}
remove_if()是algorithm文件下的函数,功能是根据用户传入的函数删除容器中的元素。我看源码的时候就有点纳闷,直接用下面的while不就行了么,干嘛还要先用find_if(抠脑阔)?
于是我自己尝试去写一个函数实现这个功能,因为处理方法是“后面的数据覆盖要删除的数据”,刚开始写的时候考虑到一个问题:那么如果第一个元素就是要删除的怎么办呢?先判断一下第一个然后再处理?貌似调用一下find_if,从第二个元素开始处理更好啊,哈哈哈哈哈,愚蠢的我貌似领悟了!