您的位置:首页 > 其它

STL中remove和remove_if用法

2012-09-17 10:49 260 查看
remove 和 remove_if方法都是包含在<algorithm>头文件当中的,先来看看原型:

// TEMPLATE FUNCTION remove
template<class _FI, class _Ty> inline
_FI remove(_FI _F, _FI _L, const _Ty& _V)
{_F = find(_F, _L, _V);
if (_F == _L)
return (_F);
else
{_FI _Fb = _F;
return (remove_copy(++_F, _L, _Fb, _V)); }}
// TEMPLATE FUNCTION remove_if
template<class _FI, class _Pr> inline
_FI remove_if(_FI _F, _FI _L, _Pr _P)
{_F = find_if(_F, _L, _P);
if (_F == _L)
return (_F);
else
{_FI _Fb = _F;
return (remove_copy_if(++_F, _L, _Fb, _P)); }}


这两个方法的前两个参数均相同,第三个参数不同。
remove的第三个参数是常量

如:

去除vector中为3的元素:

int main(int argc, char* argv[])
{
std::vector<int> vec;
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(6);
vec.push_back(8);
vec.push_back(12);
vec.push_back(22);
vec.push_back(33);

//从前往后找出3的元素,并从vector中erase
//remove第三个参数为常数的情况
vec.erase( std::remove(vec.begin(),vec.end(),3), vec.end() );

std::vector<int>::iterator iter = vec.begin();
for (iter = vec.begin(); iter != vec.end(); iter++)
{
printf("%d\n",(*iter));
}

return 0;
}


该方法std::remove(vec.begin(),vec.end(),3); 不会改变容器大小,并返回容器末端的最后一个元素.

所以单看这条语句,如打印整个容器,得到的将是:

2 4 6 8 12 22 33 33

删除的元素后面的全部往前移,并最后一个位置返回之前的最后一个元素。故最后的元素多打印了一次。

该方法结合erase方法:vec.erase( std::remove(vec.begin(),vec.end(),3), vec.end() ); 就是将返回的多出来的最后一个元素从容器中erase掉。

从而得到最后正确的结果:

2 4 6 8 12 22 33

*********************************************

remove_if方法的第三个参数是一个过滤条件,即我们要使用何种清除规则来清楚容器中的元素

如,我们要删除容器中所有为3的倍数的元素:

//该方法实现对3的倍数的元素的过滤
//参数是容器中的元素,注意返回值类型
bool RemoveItem(int item)
{
if (item%3 == 0)
{
return true;
}
else
{
return false;
}
}

int main(int argc, char* argv[])
{
std::vector<int> vec;
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(6);
vec.push_back(8);
vec.push_back(12);
vec.push_back(33);
vec.push_back(22);
//第三个参数是使用函数指针的方法调用,参数由系统自动传递
//返回值为真则清除,假则不清除
vec.erase( std::remove_if(vec.begin(),vec.end(),RemoveItem), vec.end() );

std::vector<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); iter++)
{
printf("%d\n",(*iter));
}

return 0;
}


打印结果为:

2 4 8 22
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: