在过去,我经常遇到以下问题,到目前为止,我的解决方案是将计数器与哈希表(使用开放寻址)结合起来。
我需要实现的唯一操作如下:
这是一些工作代码,当这个案例弹出时,我经常使用非常。
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_;
};
虽然这段代码通常会带来良好的表现,但我总是想知道是否有更快的方法。