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;