我是靠谱客的博主 长情绿茶,最近开发中收集的这篇文章主要介绍C++ vector 的 erase() 仍引发崩溃,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.还在使用下面代码的小朋友就不应该了

//示例(错误)
vector<Entity>::iterator iter;
for(iter = entities.begin(); iter != entities.end(); iter++)
{	//迭代遍历
if(!iter->IsAlive())	//没有活性就移除
{
entities.erase(iter); //看上去很对
}
}

(其中Entity是类名,entities是vector,iter是遍历的迭代器。)

<!> 删除是成功的,不过此时iter已经无效,变成了野指针!
再次直接使用必然会引发 违例访问的RE。

2.于是可以采用下面的方法

//示例(标准)
vector<Entity>::iterator iter;
for(iter = entities.begin(); iter != entities.end(); )
{ //迭代遍历
if(!iter->IsAlive())
{	//注意,用到了返回值 ↓
iter = entities.erase(iter);
}else{
iter++;	//没删的时候才自增
}
}

或是直接自增

//示例(标准)
vector<Entity>::iterator iter;
for(iter = entities.begin(); iter != entities.end(); )
{ //迭代遍历
if(!iter->IsAlive())
{
entities.erase( iter++ ); //后置自增
}else{
iter++;
}
}

但是我这里的环境还是会崩溃 :(

后来没有办法,只能想出来这么一招:

//示例(重遍历法)
for (i = 0; i < entities.size(); ++i)	//这里没有用迭代器
{
if (!entities.at(i).IsAlive())
{
//然后重新拿迭代器遍历 (因为erase只能用迭代器)
vector<Entity>::iterator iter;
iter = entities.begin();
int j = 0;
//对齐 ↓
while (iter != entities.end() && j != i)
iter++,j++;
//无顾虑删除,反正迭代器不要了 ↓
iter = entities.erase(iter);
}
}

正常运行!

感言:要是真的不熟悉——> 让 指针/迭代器 之类的东西少上镜,
崩溃率会大大下降。

最后

以上就是长情绿茶为你收集整理的C++ vector 的 erase() 仍引发崩溃的全部内容,希望文章能够帮你解决C++ vector 的 erase() 仍引发崩溃所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部