概述
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() 仍引发崩溃所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复