STL中remove和remove_if用法

转自:http://www.cnblogs.com/coolstand/archive/2012/09/17/2688358.html

remove 和 remove_if方法都是包含在<algorithm>头文件当中的,先来看看原型:

复制代码
 1 // TEMPLATE FUNCTION remove
 2 template<class _FI, class _Ty> inline
 3     _FI remove(_FI _F, _FI _L, const _Ty& _V)
 4     {_F = find(_F, _L, _V);
 5     if (_F == _L)
 6         return (_F);
 7     else
 8         {_FI _Fb = _F;
 9         return (remove_copy(++_F, _L, _Fb, _V)); }}
10         // TEMPLATE FUNCTION remove_if
11 template<class _FI, class _Pr> inline
12     _FI remove_if(_FI _F, _FI _L, _Pr _P)
13     {_F = find_if(_F, _L, _P);
14     if (_F == _L)
15         return (_F);
16     else
17         {_FI _Fb = _F;
18         return (remove_copy_if(++_F, _L, _Fb, _P)); }}
复制代码

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

如:

去除vector中为3的元素:

复制代码
 1 int main(int argc, char* argv[])
 2 {
 3     std::vector<int> vec;
 4     vec.push_back(2);
 5     vec.push_back(3);
 6     vec.push_back(4);
 7     vec.push_back(6);
 8     vec.push_back(8);
 9     vec.push_back(12);
10     vec.push_back(22);
11     vec.push_back(33);
12                 
13                 //从前往后找出3的元素,并从vector中erase
14                 //remove第三个参数为常数的情况
15     vec.erase( std::remove(vec.begin(),vec.end(),3), vec.end() );
16 
17     std::vector<int>::iterator iter = vec.begin();
18     for (iter = vec.begin(); iter != vec.end(); iter++)
19     {
20         printf("%d\n",(*iter));
21     }
22 
23     return 0;
24 }
复制代码

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

所以单看这条语句,如打印整个容器,得到的将是://可以单独拿出这条语句测试

2 4 6 8 12 22 33 33

删除的元素后面的全部往前移,并返回之前的最后一个元素的迭代器。故最后的元素多打印了一次。 vector.end()返回的是vector最后一个元素的下一个位置,这个位置是个空位置。

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

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

2 4 6 8 12 22 33

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

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

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

 

复制代码
 1 //该方法实现对3的倍数的元素的过滤
 2 //参数是容器中的元素,注意返回值类型
 3 bool RemoveItem(int item)
 4 {
 5     if (item%3 == 0)
 6     {
 7         return true;
 8     }
 9     else
10     {
11         return false;
12     }
13 }
14 
15 int main(int argc, char* argv[])
16 {
17     std::vector<int> vec;
18     vec.push_back(2);
19     vec.push_back(3);
20     vec.push_back(4);
21     vec.push_back(6);
22     vec.push_back(8);
23     vec.push_back(12);
24     vec.push_back(33);
25     vec.push_back(22);
26 //第三个参数是使用函数指针的方法调用,参数由系统自动传递
27 //返回值为真则清除,假则不清除
28    vec.erase( std::remove_if(vec.begin(),vec.end(),RemoveItem), vec.end() );
29 
30     std::vector<int>::iterator iter;
31     for (iter = vec.begin(); iter != vec.end(); iter++)
32     {
33         printf("%d\n",(*iter));
34     }
35 
36     return 0;
37 }
复制代码

打印结果为:

2 4 8 22

posted on 2017-04-24 22:37  freshman2014  阅读(2113)  评论(0编辑  收藏  举报

导航