C++ - Map包含太多元素

cod*_*373 0 c++ dictionary vector

我正在尝试为我正在制作的游戏创建一个实体管理器,这样我就可以轻松管理游戏中的所有实体(玩家,敌人,对象)并能够调用他们的更新和渲染功能,而无需手动执行.我正在使用一个接收int和Entity类的映射来记录实体

std::map<int, Entity*> entities;
Run Code Online (Sandbox Code Playgroud)

每当实体被添加到地图中时,它们也将被赋予随机ID,该ID被添加到向量中,这样我就可以记录已使用的ID,因此我最终不会使用完全相同的实体

IDS = std::vector<int>();

void EntityManager::AddEntity(Entity* entity)
{
int ID = rand();
for(int i = 0; i < IDS.size(); i++)
{
    if(IDS[i] == ID)
    {
        ID = rand();
        i = 0;
    }
}

entities.insert(pair<int, Entity*>(ID, entity));
}
Run Code Online (Sandbox Code Playgroud)

然后我最后调用每个实体的Update和Render函数

void EntityManager::Update(float deltaTime)
{
if(!entities.empty())
{
    for(int i = 0; i < entities.size(); i++)
    {
        if(entities[i] != nullptr)
        {
            entities[i]->Update(deltaTime);
        }
    }
}
}

void EntityManager::Render()
{
if(!entities.empty())
{
    for(int i = 0; i < entities.size(); i++)
    {
        if(entities[i] != nullptr)
        {
            entities[i]->Render();
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当我在Update和Render函数中检查地图的大小时,帧速率会立即下降到2FPS,大小类似于16587而不是它应该是什么这只是2,我只在地图中输入2个实体.我试图找出原因是什么但是我找不到它,在AddEntity函数中的"entities.insert"之后大小为2但是一旦调用了Update和Render函数,大小立即变为16587或类似的数字.除了在另一个类中的构造函数中,我不会在其他地方调用AddEntity:

entityManager->AddEntity(player);
entityManager->AddEntity(diamond);
Run Code Online (Sandbox Code Playgroud)

120*_*arm 5

entities是一个map,你使用随机整数作为关键.您不能使用索引循环来访问地图成员.该循环的每次迭代都会在地图中添加另一个条目(带有a nullptr Entity),增加大小会导致循环继续.

要通过地图迭代,您可以使用

for (const auto &ent: entities)
    ent.second->Render();
Run Code Online (Sandbox Code Playgroud)

那么你只会看到地图中的条目而不添加任何新条目.