向量中的函数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

 

 

posted @ 2012-08-26 16:23  xiaolongxia  阅读(297)  评论(0)    收藏  举报