向量中的函数erase出现的问题
一、尽量不用erase()函数!!!
原因:
先看一段代码:
1 #include <iostream> 2 #include<vector> 3 4 using namespace std; 5 6 int main() 7 { 8 int i; 9 vector<int> arr; 10 vector<int>::iterator it; 11 12 for (i=0 ; i<5 ;++i) 13 { 14 arr.push_back(i+1); 15 } 16 17 for (it = arr.begin() ; it != arr.end() ; ++it) 18 { 19 cout<<" "<<*it; 20 } 21 cout<<endl; 22 23 it=arr.begin(); 24 cout<<"erase前地址:"<<it<<"值为 "<<*it<<endl; 25 arr.erase(it); 26 cout<<"erase后地址:"<<it<<"值为 "<<*it<<endl; 27 28 return 0; 29 }
结果如下:
从结果显示可以看出,调用函数erase()前后,迭代器都是指向的最开始的地址。调用前,地址为0x001F2AE0,值为:1 ;调用后,地址为0x001F2AE0,值为2;
这也就是说,调用erase()删除迭代器所指元素后,后面的元素全部向前移动一位。
而且这也容易造成越界!!!
如果迭代器指向最后一个元素,使用erase()后,迭代器将指向了向量以外的地址,这时,如果对这个地址进行操作,将会产生越界......
参考文章:http://hi.baidu.com/smallhippo/item/92f55df073e3400a85d27803
二、通过使用remove()函数同erase()的配合,来代替erase()函数
remove函数的作用是:给你一个值val,让你删除一个容器中所有等于val的元素。
函数参数:remove(first,last,val);//first为容器的首迭代器,last为容器的末迭代器,val为要查询的值。
注意:remove函数并非是真正意义上的删除!一般与容器中的erase成员函数连用。为什么呢?让我们先来看一下remove函数在STL中的源代码:
1 template <class InputIterator, class OutputIterator, class T> 2 OutputIterator remove_copy ( InputIterator first, InputIterator last, OutputIterator result, const T& value ) 3 { 4 for ( ; first != last; ++first) 5 if (!(*first == value)) 6 *result++ = *first; 7 return result; 8 }
其实这个函数只是通过迭代器的指针向前移动来删除,所以最后会有一些元素的空间没有被完全释放。这个函数的参数是:返回进行删除操作后,最后一个元素的值下一个位置。
那么要使用erase成员函数连用,代码就是这样:myvector.erase(remove(V.begin(),V.end(),val),V.end());这样就将最后删除了最后的残余元素。
我们也可以使用resize当erase函数使用,代码就是这样:myvector.resize(remove(first,last,val)-V.begin());这样是不是就比使用erase成员函数简单多了。
参考文章:http://blog.sina.com.cn/s/blog_6d79d83a0100wh1f.html
参考2:http://www.cnblogs.com/liyazhou/archive/2010/02/07/1665421.html