linux的vector的删除数据,vector erase 在windows与Linux下的不同

昨天面试的时候,面试官突然问到这个问题,一面懵逼,感觉一样,回来试了一下,还真是不一样,做个小计。

STL中,关于vector rease的源码如下(其中以清除某个位置元素函数为例):

iterator rease(iterator position)

{

if (position + 1 != end())

copy(position + 1, finish, position);

--finish;

destroy(finish);

return position;

}

可以看到源码中返回的是一个迭代器类型,现在做一个测试,分别在windows和Linux下。

Windows下的vector erase

vector ve = { 1, 2, 3, 4, 5 };

for (auto iter = ve.begin(); iter != ve.end(); ++iter)

{

cout << *iter << endl;

if (*iter == 3)

{

ve.erase(iter); //编译OK,运行会出现问题,迭代器失效

}

}

因为运行时,发现3这个元素并删除,此时迭代器失效变成野指针,如果要是在遍历过程中继续处理后面元素可以这样写。

vector ve = { 1, 2, 3, 4, 5 };

for (auto iter = ve.begin(); iter != ve.end(); ++iter)

{

cout << *iter << endl;

if (*iter == 3)

{

ve.erase(iter); //出现野指针

//方法1:返回删除元素的下一个位置,指向4,但是for中又有一个++,没有验证第四个元素

//iter = ve.erase(iter);//返回删除元素的下一个位置

//方法2:从头开始遍历

//iter = ve.begin();

}

}

如果想不跳过,也不从头开始,可以不在for中写++iter,而是在for大括号中写++iter,防止跳过删除元素后面的那个元素。

在Linux下的vector erase

同样的代码,发现有些不同,在windows下的野指针居然能通过,郁闷

std::vector ve = {1, 2, 3, 4, 5};

for(auto iter = ve.begin(); iter != ve.end(); ++iter)

{

if(*iter == 3)

{

auto i = ve.erase(iter); //居然可以成功

std::cout << "*i: " << *i << std::endl; //*i: 4

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值