zoukankan      html  css  js  c++  java
  • 关于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)

  • 相关阅读:
    alpha冲刺9
    alpha冲刺8
    alpha冲刺7
    alpha冲刺6
    团队作业——随堂小测(同学录)
    alpha冲刺5
    alpha冲刺4
    alpha冲刺3
    设计模式——桥接模式
    Java基础——关键字
  • 原文地址:https://www.cnblogs.com/buxianghe/p/2560713.html
Copyright © 2011-2022 走看看