生成并重用唯一的,顺序的正整数

时间:2017-09-21 22:13:21

标签: c++ performance

在过去,我经常遇到以下问题,到目前为止,我的解决方案是将计数器与哈希表(使用开放寻址)结合起来。

我需要实现的唯一操作如下:

  • next:生成一个新整数或重新使用以前释放的一个
  • free:释放以前生成的整数
  • size:返回生成的整数数(不包括那些已被释放但尚未重复使用的整数)

这是一些工作代码,当这个案例弹出时,我经常使用非常

class IdGenerator
{
    typedef std::uint64_t Id;

public:
    IdGenerator():
        total_ids_(0)
    {
    }

    Id next()
    {
        Id id;
        if (available_ids_.empty())
        {
            id = total_ids_;
            ++total_ids_;
        }
        else
        {
            auto it = available_ids_.begin();
            id = *it;
            available_ids_.erase(it);
        }
        return id;
    }

    void free(Id id)
    {
        available_ids_.insert(id);
    }

    Id size() const
    {
        return total_ids_ - available_ids_.size();
    }

private:
    std::unordered_set<Id> available_ids_; // usually, I use open-adressing here
    Id total_ids_;
};

虽然这段代码通常会带来良好的表现,但我总是想知道是否有更快的方法。

0 个答案:

没有答案