无法擦除 SDL 轮询事件中的多个元素
Can't erase multiple elements inside SDL Poll Events
我正在使用SDL进行事件和窗口处理,但是我似乎无法在for循环中删除多个元素。我有两个元素,当点击删除键时,它打印出两次"Testing"——完美!然而,当两个元素都被"选中"(bool)时,它只删除第一个元素,而不删除第二个元素。
这个函数在SDL的Poll事件循环中被调用:
static inline void tickEditorKeyFunctions(CBevent e)
{
if (e.type == SDL_KEYDOWN)
{
switch (e.key.keysym.sym)
{
case SDLK_w:
break;
case SDLK_s:
break;
case SDLK_a:
break;
case SDLK_d:
break;
case SDLK_LCTRL:
break;
case SDLK_LSHIFT:
break;
case SDLK_DELETE:
for (CBuint i = 0; i < _scene->static_meshes.size(); i++)
{
if (_scene->static_meshes[i]->_picked)
_scene->static_meshes.erase(_scene->static_meshes.begin() + i);
std::cout << "Testing" << std::endl;
}
_pick_list.clear();
break;
default:
break;
}
}
}
有人知道为什么会这样吗?
谢谢。
如果static_meshes是STL集合,则需要查看Erase Remove习语来删除项。
试
_scene->static_meshes.erase(std::remove_if(_scene->static_meshes.begin(),
_scene->static_meshes.end(),
[](TYPEOF _scene->static_meshes *item){return item->picked;}),
_scene->static_meshes.end());
如果您的_scene->static_meshes
是STL容器(例如vector),则erase
销毁迭代器并更改大小。如果数组是[0, 1, 2]
并且您删除了索引1
,那么在这个数组中不再有索引2
,它现在只包含2个元素。size
将减少,您的第二次迭代可能根本不执行,或者在错误的元素上执行。可能的解决方案是在擦除元素后不增加i
。当然还有其他的方法。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- Android NDK传感器向事件队列报告奇怪的间隔
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- (XAML UWP)定义元素,包括跨多个页面(C )使用的事件
- 从事件的迭代列表中删除元素
- 复制STL:删除元素、用户定义函数作为参数和事件队列
- 查找Internet Explorer_Server的link元素并发送Click()事件(c++)
- 无法擦除 SDL 轮询事件中的多个元素