随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

关于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   紫金树下  阅读(987)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2012年6月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7

点击右上角即可分享
微信分享提示