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)

  • 相关阅读:
    泛型类,泛型方法的使用
    Mapper注解与MapperScan注解
    Configuration注解
    LA 4254 Processor (二分 + 贪心)
    UVa 10382 Watering Grass (贪心 区间覆盖)
    UVA 10795 A Different Task (递归)
    LA 3401 Colored Cubes (搜索 + 暴力)
    uva11464 Even Parity (枚举+递推)
    icpc2021 昆明 K (dfs爆搜)
    hdu3533 (bfs + 模拟)
  • 原文地址:https://www.cnblogs.com/buxianghe/p/2560713.html
Copyright © 2011-2022 走看看