Fastest container or algorithm for unique reusable ids in C++

前端 未结 8 869
暗喜
暗喜 2021-02-04 10:33

I have a need for unique reusable ids. The user can choose his own ids or he can ask for a free one. The API is basically

class IdManager {
public:
  int Allocat         


        
8条回答
  •  误落风尘
    2021-02-04 10:51

    Similar to skwllsp, I'd keep track of the ranges that have not been allocated, but my methods are slightly different. The base container would be a map, with the key being the upper bound of the range and the value being the lower bound.

    IdManager::IdManager()
    {
        m_map.insert(std::make_pair(std::numeric_limits::max(), 1);
    }
    
    int IdManager::AllocateId()
    {
        assert(!m_map.empty());
        MyMap::iterator p = m_map.begin();
        int id = p->second;
        ++p->second;
        if (p->second > p->first)
            m_map.erase(p);
        return id;
    }
    
    void IdManager::FreeId(int id)
    {
        // I'll fill this in later
    }
    
    bool IdManager::MarkAsUsed(int id)
    {
        MyMap::iterator p = m_map.lower_bound(id);
    
        // return false if the ID is already allocated
        if (p == m_map.end() || id < p->second || id > p->first)))
            return false;
    
        // first thunderstorm of the season, I'll leave this for now before the power glitches
    }
    
    bool IdManager::IsUsed(int id)
    {
        MyMap::iterator p = m_map.lower_bound(id);
        return (p != m_map.end() && id >= p->second && id <= p->first);
    }
    

提交回复
热议问题