STL中remove和remove_if用法
2012-09-17 10:49
260 查看
remove 和 remove_if方法都是包含在<algorithm>头文件当中的,先来看看原型:
这两个方法的前两个参数均相同,第三个参数不同。
remove的第三个参数是常量
如:
去除vector中为3的元素:
该方法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的倍数的元素:
打印结果为:
2 4 8 22
// 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
相关文章推荐
- STL常见用法整理_remove_if
- STL-remove_if()的用法
- STL中remove_if()/find_if()/replace_if()的使用方法(The usages of remove_if()/find_if()/replace_if() )
- STL学习(七)remove_if 学习
- 【C++STL】vector的count()和count_if()函数的用法
- STL_Algorithm3: remove, remove_if, remove_copy, remove_copy_if
- STL的find_if用法(包含嵌套类)
- stl.find_if用法总结
- 如何使用remove_copy_if() algorithm? (C/C++) (STL)
- STL_ count,count_if用法
- 关于 STL 的 remove_if
- remove_if 的用法
- stl.find_if用法总结
- stl list.remove_if使用
- STL之remove、remove_copy、remove_if、remove_copy_if
- stl中remove和remove_if的陷阱
- remove_if用法
- STL常用算法: remove,remove_if,remove_copy,remove_copy_if,remove系列算法和partition的区别...
- C++/STL_利用remove_if 删除vector,list,deque满足条件的元素
- STL 如何使用list::remove_if