提防在指针的容器上使用类似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; }