remove(remove函数)硬核推荐
如果你真的想删除东西的话就在类似remove的算法后接上erase。
算法简介C++ 标准库提供了大量可以用来对容器及其它序列进行算法操作的函数这些组件可以是函数或者函数模板,大部分由头文件 提供以下四个remove相关的函数就包含在头文件algorithm中。
四个remove详细介绍1、remove//函数原型template ForwardIterator remove (ForwardIterator first, ForwardIterator last,
const T& val);作用:删除具有给定值的元素是通过将与val相等的元素替换为下一个不相等的元素来完成移除的,函数不能改变包含元素的容器的属性(即它不能改变容器的大小),函数以迭代器的形式返回出最后一个相等元素的下一个位置。
2、remove_if//函数原型template ForwardIteratorremove_if (ForwardIterator
first, ForwardIteratorlast,UnaryPredicatepred);作用:删除满足pred函数条件的元素,是在remove的基础上,增加了一个一元函数,接受一定迭代器first到last的元素作为参数,返回值表示该元素是否成功移除,该函数可以是函数指针,也可以是函数对象。
3、remove_copy//函数原型template OutputIterator remove_copy (InputIterator first, InputIterator last,OutputIterator result,
const T& val);作用:复制序列时删除具有给定值的元素,是将范围内不等于val的元素copy到从迭代器result开始的范围内4、remove_copy_if//函数原型template
InputIterator, class OutputIterator, class UnaryPredicate>OutputIterator remove_copy_if (InputIterator first, InputIterator last,OutputIterator result, UnaryPredicate pred);
作用:复制序列时删除满足一元函数pred条件的元素,是在remove_copy的基础上,增加了一个一元函数,接受一定迭代器first到last的元素作为参数注意:以上几个remove的传入参数都是迭代器,通过迭代器无法得到容器本身,而要删除容器内的元素。
只能通过容器的成员函数来进行因此remove系列函数无法真正删除元素,只能把要删除的元素移到容器末尾并返回要被删除元素的迭代器如果需要真正的删除具体的元素则需要结合容器的成员函数erase进行操作如果你真的想删除东西的话就在类似remove的算法后接上erase。
(出自《Effective STL》条款32,书中深入介绍了很多STL使用的技巧,推荐各位详细看一下本书)实例演示#include#include#include
usingnamespacestd;//打印数据voidmyCout(vector &vec){for (vector::iterator iter = vec.begin(); iter < vec.end(); ++iter)
cout << *iter << " ";cout << endl;}//判断奇数boolIsOdd(int i){ return ((i % 2) == 1); }//判断偶数boolIsEven(int
i){ return ((i % 2) == 0); }//remove测试voidmyRemove(){vector vec;for (int i = 0; i < 10; i++) vec.push_back(i);
remove(vec.begin(), vec.end(), 2); myCout(vec); vec.erase(remove(vec.begin(), vec.end(), 3));
myCout(vec);}//remove_if测试voidmyRemoveIf(){vector vec;for (int i = 0; i < 10; i++) vec.push_back(i);
vector::iterator iterRev = remove_if (vec.begin(), vec.end(), IsOdd); myCout(vec);//不满足删除条件的元素
for (vector::iterator iter = vec.begin(); iter < iterRev; iter++)cout << *iter <<" ";cout <
;//删除vec中所有的偶数 vec.erase(remove_if(vec.begin(), vec.end(), IsEven),vec.end()); myCout(vec);}//remove_copy测试
voidmyRemoveCopy(){vector vec;for (int i = 0; i < 10; i++) { vec.push_back(i);if (2 < i <
6) { vec.push_back(i); } } myCout(vec);vector vecRet(vec.size());
remove_copy(vec.begin(), vec.end(), vecRet.begin(), 3); myCout(vecRet);}//remove_copy_if测试void
myRemoveCopyIf(){vector vec;for (int i = 0; i < 10; i++) { vec.push_back(i);if (2 < i <
6) { vec.push_back(i); } } myCout(vec);vector vecRet(vec.size());
remove_copy_if(vec.begin(), vec.end(), vecRet.begin(), IsOdd); myCout(vecRet);}intmain(){cout <<
"--------------------------------------------------" << endl; myRemove();cout << "--------------------------------------------------"
<< endl; myRemoveCopy();cout << "--------------------------------------------------" << endl; myRemoveIf();
cout << "--------------------------------------------------" << endl; myRemoveCopyIf();return0;}代码运行结果:
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186