remove 和 erase

remove 和 erase

1. 说明

remove是独立于类型的函数

erase在各个容器中有对应实现

remove只能把 所有待删除的元素进行移动,但是不能更改实际大小(也没法更改,他无法知道是什么容器以及容器内部legnth也无法更改),返回一个指向待删除元素的迭代器

erase指定一个迭代器,然后删除这个迭代器,返回下一个迭代器的值

2. 一般就配合使用

#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
    vector<int> test{1,2};
    test.erase(remove(a.begin(), a.end(), 1), a.end());
    return 0;
}

咋说呢,你没有remove也能实现删除,但是有了remove这些函数代码就会很简洁

3. 多说一句erase

​ 使用erase会造成参数的迭代器失效,所以每次调用后,参数的迭代器应该赋值

​ 推荐 iterator = erase(iterator)

3. 本质

template<typename _ForwardIterator, typename _Tp>
_ForwardIterator
remove(_ForwardIterator __first, _ForwardIterator __last,
   const _Tp& __value)
{
  // concept requirements
  __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
			  _ForwardIterator>)
  __glibcxx_function_requires(_EqualOpConcept<
    typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
  __glibcxx_requires_valid_range(__first, __last);

  __first = _GLIBCXX_STD_A::find(__first, __last, __value);
  if(__first == __last)
    return __first;
  _ForwardIterator __result = __first;
  ++__first;
  for(; __first != __last; ++__first)
    if(!(*__first == __value))
      {
        *__result = _GLIBCXX_MOVE(*__first);
        ++__result;
      }
  return __result;
}

注意看

  ++__first;
  for(; __first != __last; ++__first)
    if(!(*__first == __value))
      {
        *__result = _GLIBCXX_MOVE(*__first);
        ++__result;
      }

就是把元素找到,然后进行移动构造,这样就把后面所有的非删除元素移动到前面,这样不停执行移动,最终返回 第一个待删除元素
内部依赖了find找到第一个待删除元素

4. remove_if 是干啥的

相对于remove,remove_if让你可以指定一个条件参数

remove_if(beg, end, op)   //移除区间[beg,end)中每一个“令判断式:op(elem)获得true”的元素;
#include <iostream>
#include <vector>
#include <algorithm>
bool IsSpace(int x) { return x == 3 || x == 4; }


int main()
{
    vector<int> test{1, 2, 3, 4, 5};
    test.erase(remove_if(test.begin(), test.end(), IsSpace), test.end());
    for( auto&& p : test ) {
        std::cout << p << std::endl;
    }
    return 0;
}
posted @ 2021-05-23 21:15  make_wheels  阅读(215)  评论(0编辑  收藏  举报