std::remove_if
是C++ STL库algorithm头文件中的一个函数,可以用于删除容器中满足指定条件的元素。下面是std::remove_if
的使用说明,结合了zhuanlan.zhihu.com和zhuanlan.zhihu.com的内容:
-
std::remove_if
的参数是迭代器,前两个参数表示迭代的起始位置和这个起始位置所对应的停止位置,最后一个参数是一个回调函数,如果回调函数返回为真,则将当前所指向的参数移到尾部。 -
std::remove_if
无法真正删除元素,只能把要删除的元素移到容器末尾并返回要被删除元素的迭代器,然后通过erase成员函数来真正删除。因为一般remove_if
和erase
函数是成对出现的。 -
std::remove_if
会返回被移动区域的首个元素,需要通过erase函数来真正删除元素。 -
std::remove_if
可以用于删除容器中满足指定条件的元素,可以使用lambda表达式作为回调函数,也可以使用自定义的函数对象。 - 使用
std::remove_if
时需要注意,容器中最后一个元素如果恰好是要删除的元素,它将无法被覆盖掉,因为std::remove_if
是通过覆盖移去的,相关测试代码可以参考zhuanlan.zhihu.com中的例子。
除了std::remove_if
,C++ STL库algorithm头文件中还有std::remove
和erase
函数,它们也可以用于删除容器中的元素。下面是它们的用法探讨,结合了zhuanlan.zhihu.com的内容:
-
std::remove
不会改变输入vector的长度。其过程相当于去除指定的字符,剩余字符往前靠。后面的和原始字符保持一致。 - 使用
std::remove
时需要注意,容器中最后一个元素如果恰好是要删除的元素,它将无法被覆盖掉,因为std::remove
是通过覆盖移去的。 -
erase
函数可以直接删除容器中满足指定条件的元素,但需要注意,使用erase
函数删除元素后,后面的元素会向前移动,所以返回值指向下一个元素的迭代器其实跟刚刚被删除元素的迭代器是一样的。 - 对于大数据量的操作,使用
std::remove_if
和erase
函数组合的方式,效率比直接使用erase
函数要高,具体可以参考zhuanlan.zhihu.com中的测试代码。