C++中的std::remove_if

std::remove_if是C++ STL库algorithm头文件中的一个函数,可以用于删除容器中满足指定条件的元素。下面是std::remove_if的使用说明,结合了zhuanlan.zhihu.comzhuanlan.zhihu.com的内容:

  • std::remove_if的参数是迭代器,前两个参数表示迭代的起始位置和这个起始位置所对应的停止位置,最后一个参数是一个回调函数,如果回调函数返回为真,则将当前所指向的参数移到尾部。
  • std::remove_if无法真正删除元素,只能把要删除的元素移到容器末尾并返回要被删除元素的迭代器,然后通过erase成员函数来真正删除。因为一般remove_iferase函数是成对出现的。
  • std::remove_if会返回被移动区域的首个元素,需要通过erase函数来真正删除元素。
  • std::remove_if可以用于删除容器中满足指定条件的元素,可以使用lambda表达式作为回调函数,也可以使用自定义的函数对象。
  • 使用std::remove_if时需要注意,容器中最后一个元素如果恰好是要删除的元素,它将无法被覆盖掉,因为std::remove_if是通过覆盖移去的,相关测试代码可以参考zhuanlan.zhihu.com中的例子。

除了std::remove_if,C++ STL库algorithm头文件中还有std::removeerase函数,它们也可以用于删除容器中的元素。下面是它们的用法探讨,结合了zhuanlan.zhihu.com的内容:

  • std::remove不会改变输入vector的长度。其过程相当于去除指定的字符,剩余字符往前靠。后面的和原始字符保持一致。
  • 使用std::remove时需要注意,容器中最后一个元素如果恰好是要删除的元素,它将无法被覆盖掉,因为std::remove是通过覆盖移去的。
  • erase函数可以直接删除容器中满足指定条件的元素,但需要注意,使用erase函数删除元素后,后面的元素会向前移动,所以返回值指向下一个元素的迭代器其实跟刚刚被删除元素的迭代器是一样的。
  • 对于大数据量的操作,使用std::remove_iferase函数组合的方式,效率比直接使用erase函数要高,具体可以参考zhuanlan.zhihu.com中的测试代码。