获取地图中的第一个可用密钥

nat*_*tli 5 c++ map

我有一个地图,通过他们的ID存储指向对象的指针.

typedef std::map<unsigned int, Entity*> entityMap;
entityMap entitymap;
Run Code Online (Sandbox Code Playgroud)

要为实体分配ID,我可以在entitymap中获取最新值并将其增加1.

Entity *entity = new Entity;
entity->id = /*newest entity+1*/;
entitymap.insert(std::pair<unsigned int,Entity*>(entity->id,entity));
Run Code Online (Sandbox Code Playgroud)

但是这个数字可能变得不必要地大,因为一个实体会被删除并从地图中删除.

std::map<unsigned int,Entity*>::iterator it;
it = entitymap.find(EntityID);
if(it != entitymap.end())
{
    Entity *entity= it->second;
    entitymap.erase(it);
}
delete entity;
Run Code Online (Sandbox Code Playgroud)

所以我可以拥有一个包含这些值的地图;

1,2,4,8,10
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我希望下一个实体申请该ID 3.

Ker*_* SB 4

由于 ID 是按数字排序的,因此您可以遍历整个地图,直到找到一个“洞”:

unsigned int i = 1; // or whatever your smallest admissable key value is

for (auto it = m.cbegin(), end = m.cend();
                           it != end && i == it->first; ++it, ++i)
{ }

// now i is the next free index
Run Code Online (Sandbox Code Playgroud)

如果地图很大并且第一个洞接近终点,这可能需要很长时间。您可以首先检查最大键值(由 给出m.crbegin()->first)是否明显大于m.size()开始此探索之前。

  • @natli:这就是所谓的“空闲列表”。是的,这是一个选择。您应该阅读有关这些的数据结构书籍;您可以获得一些非常复杂且非常高效的空闲列表实现。您将不再拥有“std::map”,但如果空间和性能至关重要,那么可能值得一试。 (2认同)