提防在指针的容器上使用类似remove的算法 —— 《Effective STL》笔记

以前知道,std::remove 和 std::remove_if 会将不符合条件 item 的往前移,然后返回一个指向符合条件的起始item的迭代器。我原来以为是会进行交换,昨晚看了《Effective STL》里面提到的这个,去看了一下 std::remove_if 的实现(摘自 LLVM),发现只是单纯地将不符合条件的覆盖掉符合条件的 item。想想也是,这样性能更好。

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;
}

 

发表回复