迭代器的删除问题
来源:互联网 发布:阿里云国际版账号注册 编辑:程序博客网 时间:2024/05/23 20:24
it = m_ballActionsMgr.begin();
for (; it !=m_ballActionsMgr.end(); ++it)
{
if ((*it)->isFinished())
{
BallAction* act = *it;
m_ballActionsMgr.erase(it);
CC_SAFE_DELETE(act);
break;
}
}
这样删除是正确的
it = m_ballActionsMgr.begin();
for (; it != m_ballActionsMgr.end(); ++it)
{
if ((*it)->isFinished())
{
m_ballActionsMgr.erase(it);
BallAction* act = *it;
CC_SAFE_DELETE(act);
break;
}
}
这样删除有问题,删除迭代器以后,迭代器又加了1,所以删除的是下一个元素,这样的做法是不能一次性删除符合要求的元素
改进,先把符合要求删除的元素放在另外一个迭代器,然后再统一删除
vector<BallAction*>::iterator it =m_ballActionsMgr.begin();
for (; it !=m_ballActionsMgr.end(); ++it)
{
BallAction* act = *it;
act->updateData(dt);
if (act->isFinished())
{
m_willDelActionsMgr.push_back(act);
}
}
//把完成的动作删除
vector<BallAction*>::iterator delIt =m_willDelActionsMgr.begin();
for (; delIt !=m_willDelActionsMgr.end(); ++delIt)
{
vector<BallAction*>::iterator existIt =std::find(m_ballActionsMgr.begin(),
m_ballActionsMgr.end(),
*delIt);
if (existIt !=m_ballActionsMgr.end())
{
m_ballActionsMgr.erase(existIt);
}
}
delIt = m_willDelActionsMgr.begin();
for (; delIt !=m_willDelActionsMgr.end(); ++delIt)
{
BallAction* act = *delIt;
CC_SAFE_DELETE(act);
}
m_willDelActionsMgr.clear();
// 2014-01-22
今天总算搞明白了为什么会删除后一个内容,因为vector是数组,删除的时候,后面的元素会往前移动,所以就删除了后一个内容
以前遍历删除迭代器删除完之后都用break;
正确的方法,
for (std::vector<int>::iterator it = value.begin(); it != value.end();)
{
if (condition)
{
value.erase(it++);
}
else
{
it++;
}
}
- 迭代器的删除问题
- ListItem的删除问题
- DynaActionForm删除的问题
- feckeditor的删除问题
- ssh删除的问题
- multimap的删除问题
- 删除卷组时的问题
- 删除重复记录的问题
- 关于级联删除的问题
- 删除oracle的相关问题
- 数据库复制删除的问题
- 数据库复制删除的问题
- Oracle10G删除表的问题
- hibernate 级联删除的问题
- access关联删除的问题
- 业务单据的删除问题
- PHP批量删除的问题
- 键盘缓冲区的删除问题
- 北大ACM 1007题 感觉本人写的代码还可以 和大家分享下
- JAVA代码片段--获取当前是星期几
- unix基础篇
- Cocos2dx: 弹出对话框的设计与实现
- 设计模式总结
- 迭代器的删除问题
- jsp 按照数据规则输出类似合并单元格类型的数据
- j2se之方法的封装
- Android Studio 中文编码问题
- repast HPC初探(运行其自带例子过程中出现的问题)
- Maven pom.xml 配置详解
- WINDOWS下的ANSI字符串和UTF8字符串之间的相互转换
- 排序算法之插入排序
- map/reduce二次排序