如果想要刪除vector中值為val的元素,最容易想到的方法就是對vector進行遍歷,然后遇到值為val時就將其刪除。比較好的是vector容器有erase操作。
但是這兒需要注意,與list中的erase不同,list的erase操作之后,之前獲得的迭代器還是有效的,而在vector中因為vector是順序存儲,所以,一旦刪除一個元素,之前獲得的迭代器就會失效了,vector.begin()和vector.end()是變化的。注意到,erase的返回值是一個迭代器,而這個迭代器就是指向刪除之前元素后的第一個元素。注意到這一點我們可以采用下面的方法實現:
或者用while循環
其實還可以采用另一種方法,在STL的算法中有一個函數remove,這個函數可以將迭代器范圍內的等於某個值的元素“刪除“(這里的刪除是不改變容器的大小,只是將一些不滿足條件的元素前移,這樣的話保留的元素都移到了容器的前面,而remove正好就指向這些保留元素后的第一個元素,而后面的就是要刪除的。)然后執行erase操作就可以了。
完整程序如下:
但是這兒需要注意,與list中的erase不同,list的erase操作之后,之前獲得的迭代器還是有效的,而在vector中因為vector是順序存儲,所以,一旦刪除一個元素,之前獲得的迭代器就會失效了,vector.begin()和vector.end()是變化的。注意到,erase的返回值是一個迭代器,而這個迭代器就是指向刪除之前元素后的第一個元素。注意到這一點我們可以采用下面的方法實現:
void remove_v(vector<
int>& v,
int val){
vector< int>::iterator ite;
for(ite=v.begin();ite!=v.end();){
if(*ite==val)
ite=v.erase(ite);
else
++ite;
}
}
vector< int>::iterator ite;
for(ite=v.begin();ite!=v.end();){
if(*ite==val)
ite=v.erase(ite);
else
++ite;
}
}
或者用while循環
void remove_v(vector<
int>& v,
int val){
vector< int>::iterator ite=v.begin();
while(ite!=v.end()){
if(*ite==val)
ite=v.erase(ite);
else
++ite;
}
}
vector< int>::iterator ite=v.begin();
while(ite!=v.end()){
if(*ite==val)
ite=v.erase(ite);
else
++ite;
}
}
void remove_v2(vector<
int>& v,
int val){
v.erase(remove(v.begin(),v.end(),val),v.end());
}
v.erase(remove(v.begin(),v.end(),val),v.end());
}
#include <iostream>
#include <fstream>
int main( int argc, char* argv[]){
using namespace std;
fstream in, out;
if(argc> 1) in.open(argv[ 1],ios:: in|ios::binary);
if(argc> 2) out.open(argv[ 2],ios:: out|ios::binary);
( out.is_open()? out:cout)
<<
( in.is_open()? in:cin).rdbuf();
}
#endif
#if 0
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
void remove_v(vector< int>& v, int val){
vector< int>::iterator ite;
for(ite=v.begin();ite!=v.end();){
if(*ite==val)
ite=v.erase(ite);
else
++ite;
}
}
void remove_v2(vector< int>& v, int val){
v.erase(remove(v.begin(),v.end(),val),v.end());
}
int main(){
int a[]={ 1, 2, 3, 1, 2, 3, 1, 2, 3, 3, 3, 0, 3, 8};
int len= sizeof(a)/ sizeof(a[ 0]);
vector< int> v(a,a+len);
copy(v.begin(),v.end(),ostream_iterator< int>(cout, " "));
cout<<endl;
int val= 3;
remove_v2(v,val);
copy(v.begin(),v.end(),ostream_iterator< int>(cout, " "));
cout<<endl;
}
#include <fstream>
int main( int argc, char* argv[]){
using namespace std;
fstream in, out;
if(argc> 1) in.open(argv[ 1],ios:: in|ios::binary);
if(argc> 2) out.open(argv[ 2],ios:: out|ios::binary);
( out.is_open()? out:cout)
<<
( in.is_open()? in:cin).rdbuf();
}
#endif
#if 0
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
void remove_v(vector< int>& v, int val){
vector< int>::iterator ite;
for(ite=v.begin();ite!=v.end();){
if(*ite==val)
ite=v.erase(ite);
else
++ite;
}
}
void remove_v2(vector< int>& v, int val){
v.erase(remove(v.begin(),v.end(),val),v.end());
}
int main(){
int a[]={ 1, 2, 3, 1, 2, 3, 1, 2, 3, 3, 3, 0, 3, 8};
int len= sizeof(a)/ sizeof(a[ 0]);
vector< int> v(a,a+len);
copy(v.begin(),v.end(),ostream_iterator< int>(cout, " "));
cout<<endl;
int val= 3;
remove_v2(v,val);
copy(v.begin(),v.end(),ostream_iterator< int>(cout, " "));
cout<<endl;
}
參考:
http://www.cppblog.com/guaguaman/archive/2010/11/10/133240.html
http://blog.csdn.net/metasearch/article/details/2386939/