原理源码
此函数无法删除元素,因为使用的是迭代器,不能删除元素,只能把要删除的元素移到容器末尾【不一定,如果有多个目标元素的话】并返回要被删除元素的迭代器。
源码如下,使用的方式是将后面的一个元素移动到前面,逐个把后面的所有元素往前移动一个位置,但并不会把要删除的元素的值移动到最后,最后一个元素的值还只是原本存放在最后一个位置的值。
因为 remove_if 就是用来删除的,因此这个值没有意义,事实上在移动的过程中,要删除的元素就可以理解为被删除了【会被后面的元素值覆盖】,之后只要把最后一个元素的空间释放即可
// STL源码
template<typename _ForwardIterator, typename _Predicate>
_ForwardIterator __remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
{
__first = std::__find_if(__first, __last, __pred);
if (__first == __last)
return __first;
_ForwardIterator __result = __first;
++__first;
for (; __first != __last; ++__first)
if (!__pred(__first))
{
*__result = _GLIBCXX_MOVE(*__first);
++__result;
}
return __result;
}
来源:https://blog.csdn.net/m0_51691879/article/details/124953373