STL中remove和remove_if用法
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
删除的元素后面的全部往前移,并最后一个位置返回之前的最后一个元素。故最后的元素多打印了一次。
该方法结合erase方法:vec.erase( std::remove(vec.begin(),vec.end(),3), 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