关于vector::erase的问题

vector::erase在VC6.0和VS2010中有不同的表现

#include<iostream>
#include<vector>
#include<cassert>

using namespace std;

int main(void)
{
vector<int> vec;

vec.push_back(1);
vec.push_back(6);
vec.push_back(7);
vec.push_back(5);

vector<int>::iterator it1=vec.begin();
vector<int>::iterator it2=it1;

/*  例子1

   vec.erase(it1);

  cout<<*it1<<endl;

*/

/*  例子2
for(;it1!=vec.end();)
{
  if(6==*it1)
  {
    it2=it1;
    cout<<(int*)it2<<endl;
    vec.erase(it2);

    cout<<(int*)it2<<endl;
    cout<<*it2<<endl;
  }
  it1++;
  }

*/
  cout<<vec.size()<<endl;
  system("pause");
  return 0;
}

  同样的一段代码,插入4个数字,1,6,7,5,

  对于例子1,在VC6上,运行结果为6,我们可以得知此时迭代器it1指向的内容就是6,单步调试下,发现it1的值没有改变,即我们可以做出这样的猜测--->在VC6上,删除(erase)it1之后,it1指向的后面的内容会自动往前覆盖,即此时6占据原来存放1的内存位置(1被删除),7占据原来6的位置,5占据原来7的位置。

  但是在VS2010上,程序运行会崩溃,编译没问题。c++ primer上解释的是,vector.erase(p)之后,所有指向p所指的内存的迭代器全部失效。即此时it1,it2全部失效。

  对于例子2也是(把push_back(7)换成push_back(6),程序员面试宝典上面题目),这个例子本意是删除这4个元素中为6的元素,但若是在VC6上面,就会跳过第二个6,最后结果为1,6(第二个6),5,但若是在VS2010上,就会运行部通过。

  最后,vector.erase函数的标准形式是:

  iterator erase(iterator)

  iterator erase(iterator first, iterator last) => [first,last)

posted on 2012-06-25 09:29  紫金树下  阅读(987)  评论(0编辑  收藏  举报