一个提供分配ID和回收ID的自增ID池
struct FIDPool
{
public:
FIDPool()
{
NextNewID = 0;
MaxId = 99999;
};
// 使用一组ID来初始化ID池
void InitializeWithIds(const TArray<int32>& InitialIds)
{
RecycledIDs.Empty();
if(InitialIds.IsEmpty()) return;
ExistingIDs = InitialIds;
ExistingIDs.Sort();
//初始化可回收ID
int32 Value = 0;
for (int32 i = 0; i < ExistingIDs.Num(); ++i)
{
if (Value == ExistingIDs[i])
{
Value++;
continue;
}
if (Value > ExistingIDs[i])
{
continue;
}
while (Value < ExistingIDs[i])
{
RecycledIDs.Emplace(Value);
Value++;
}
Value++;
}
NextNewID = ExistingIDs.Last() + 1;
};
//分配ID
int32 AllocateId()
{
int32 ResID = -1;
//如果有回收的ID,则使用回收的ID
if (!RecycledIDs.IsEmpty())
{
ResID = RecycledIDs.Pop();
ExistingIDs.Push(ResID); // 标记为已存在
return ResID;
}
//合法范围自增
if (0 <= NextNewID && NextNewID <= MaxId)
{
ResID = NextNewID;
ExistingIDs.Push(NextNewID);
NextNewID++;
return ResID;
}
//无可用ID
return ResID;
};
//回收ID
void RecycleID(const int32 ID)
{
if (ExistingIDs.Contains(ID))
{
ExistingIDs.RemoveSwap(ID);
RecycledIDs.Push(ID);
}
};
//重置ID池
void Reset()
{
RecycledIDs.Empty();
ExistingIDs.Empty();
NextNewID = 0;
};
private:
TArray<int32> RecycledIDs; //回收的ID
TArray<int32> ExistingIDs; // 已存在的ID
int32 NextNewID;
int32 MaxId;
};