• 关于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)

  • 相关阅读:
    杭电 1176 免费馅饼
    IE 8 浏览器 F12 调试功能无法使用
    SqlServer 经常使用分页方法总结
    cocos2d-x 2.0下怎样让BOX2D DEBUG DRAW的方法笔记
    在DIV中自己主动换行
    linux之SQL语句简明教程---主键,外来键
    java数据库连接池技术简单使用
    Windows和linux双系统——改动默认启动顺序
    程序员实用的 MySQL sql 语句
    android 多项对话框
  • 原文地址:https://www.cnblogs.com/buxianghe/p/2560713.html
Copyright © 2020-2023  润新知