remove 算法描述:查找的得到第一个元素的位置,然后从此位置开始遍历容器,将后面的元素依次前移,跳过和value相同值的元素,也就是说,所有和value相同值的元素都会被覆盖,而其他的元素都会依次前移。最后remove返回"指向最后一个 '有用' 元素的iterator",但是在remove算法过程中,并没有修改原容器的size,以及end()。但是从逻辑角度看,最后的[ 从remove得到的iterator---_result, 容器的结尾end() ) 这个区间里面的元素已经没有意义了。所以这些元素不应该属于该容器了。remove算法能做的仅此而已,并没有删除这些无用的元素。
对于一个连续内存容器(vector、deque或者string),最好的办法是使用erase-remove习惯用法
c.erase(remove(c.begin(),c.end(),124),c.end());
#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <list>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
string s;
int a[10]={1,2,3,4,2,6,7,2,9,0};
list<int> lst;
vector<int> v;
deque<int> dq;
v.insert(v.begin(),a,a+10);
vector<int>::iterator it=remove(v.begin(),v.end(),2);
for(int i=0;i<v.size();++i)
cout<<v[i]<<" ";
cout<<endl;
v.erase(it,v.end());
for(int i=0;i<v.size();++i)
cout<<v[i]<<" ";
return 0;
}
如果将移除的值改为判别式,则可以使用remove_if
#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <list>
#include <deque>
#include <algorithm>
using namespace std;
bool BadVal(int x){
return x%2;
}
int main()
{
string s;
int a[10]={1,2,3,4,5,6,7,8,9,0};
list<int> lst;
vector<int> v;
deque<int> dq;
v.insert(v.begin(),a,a+10);
vector<int>::iterator it=remove_if(v.begin(),v.end(),BadVal);
for(int i=0;i<v.size();++i)
cout<<v[i]<<" ";
cout<<endl;
v.erase(it,v.end());
for(int i=0;i<v.size();++i)
cout<<v[i]<<" ";
return 0;
}