Vector erase操作 core down

来源:互联网 发布:放逐之城 修改数据 编辑:程序博客网 时间:2024/06/07 00:29

  • Vector erase操作 core down
    • 复现代码
    • 第一个坑
    • 还有坑
    • 改进代码

Vector erase操作 core down

复现代码

for(std::vector<int>::iterator iter=uid.begin(); iter!=uid.end(); iter++)            {                if( *iter == temp_uid) {                    iter = uid.erase(iter);                }            }

第一个坑

vector的删除操作会有一个坑,就是删除的时候一定要将删除操作的结果赋值给一个新的迭代器。

因为执行erase操作之后,执行操作的iter会变的无效。这时应该使用erase的返回结果,返回结果是被删除元素的下一个位置。

所以操作必须是这样的

iter = uid.erase(iter);

还有坑

然而这样服务启动还是core了,single 11

这是为什么呢
当满足删除要求的是最后一个元素时,问题就出现了。例如上面的例子里,当删除最后一个元素的时候,返回的迭代器就指向了end。

按照for循环的执行逻辑,先判断条件,然后执行,最后执行递增进入下一次循环。

于是对返回的迭代器递增,这时候迭代器已经飞起来了(不知道指向哪里),新一轮循环开始,判断迭代器是否指向end,肯定不满足,接着执行循环体,此时越界了。

改进代码

for(std::vector<int>::iterator iter=uid.begin(); iter!=uid.end(); ){    if( *iter == temp_uid) {        iter = uid.erase(iter);    }else        iter++;}

递增逻辑由自己实现,命中删除操作的时候不进行iter++。这样就没问题了。

原创粉丝点击