编程时我们经常遇到要“删除与某值相等的元素”的问题。
假设序列3 1 3 2 3 3 3 4 3 5 3 6,要把序列中的3删除,我们可以使用如下代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
freopen("test.in","r",stdin);
vector<int> coll;
int i;
while(cin>>i){
coll.push_back(i);
}
coll.erase(remove(coll.begin(),coll.end(),3),coll.end());
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
return 0;
}
在STL中erase(beg,end)移除[beg,end]区间内的所有元素,返回下一元素的位置。
remove(beg,end,val)移除[beg,end]区间内所有值为val的元素,返回一个新的end位置。
为什么要在erase中嵌套remove呢?
自己动手试一试,直接用remove会发现输出结果是1 2 4 5 6 3 3 4 3 5 3 6,前面的5个数字是我们想要的结果,但后面的7个数字不是我们想要的。前面说了,remove会返回一个新的end位置,这个位置刚好指向7个数字里的第一个,所以要在erase中嵌套remove。
如果只想把第一个3给删除要怎么办呢?
可以使用如下代码:
...
vector<int>::iterator pos;
pos=find(coll.begin(),coll.end(),3);
if (pos!=coll.end()){
coll.erase(pos);
}
...
这段代码见名思意了,值得一提的是find函数如果没有查找到相应的值会返回一个end()的位置。
留几个小问题,仅供茶余饭后思考娱乐:
1.删除前3个3。
2.保留最后一个3,删除其余的3。