无法擦除 SDL 轮询事件中的多个元素

Can't erase multiple elements inside SDL Poll Events

本文关键字:元素 事件 擦除 SDL      更新时间:2023-10-16

我正在使用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。当然还有其他的方法。