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 阅读(2137) 评论(0) 收藏 举报

浙公网安备 33010602011771号