std::remove_if 用于移除 vector 中满足自定义条件的元素。它的第三个参数是一个谓词函数,返回值表示该元素是否应被删除,用法类似于 std::sort 中自定义比较函数。

注意事项

  • remove_if 会遍历指定的元素区间,但它只是移动元素位置——满足条件的元素可能被后续元素覆盖。它返回的是"可以 erase 的起始位置",因此必须配合 erase 才能真正完成删除。
  • 如果模板类型是对象指针,remove_if 内部仅移动了指针,调用 erase 后可能导致内存泄漏。这种情况下建议自己写循环,或者在回调函数中对满足条件的元素提前释放内存。

标准库实现

		// TEMPLATE FUNCTION remove_if
template<class _FwdIt,
	class _Pr> inline
	_FwdIt _Remove_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
	{	// remove each satisfying _Pred
	_FwdIt _Next = _First;
	for (++_First; _First != _Last; ++_First)
	if (!_Pred(*_First))
		*_Next++ = _Move(*_First);
	return (_Next);
	}

使用示例

	std::vector<char> str;
	str.push_back('1');
	str.push_back('2');
	str.push_back('3');
	str.push_back('4');
	str.push_back('5');
	str.push_back('\0');


	cout << &(str[0]) << endl;


	str.erase(std::remove_if(str.begin(), str.end(), [](char c)->bool
	{
		if (c == '2')//自定义条件
		{
			return true;
		}
		return false;
	}));


	cout << &(str[0]) << endl;