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;