如何在C++中为增加但记住删除先前对象的对象分配唯一标识符

How assigning unique identifiers to an object that increase but remembers deletion of previous objects, in C++

本文关键字:对象 删除 标识符 唯一 分配 C++ 增加      更新时间:2023-10-16

1. 问题所在

我希望每个对象都有一个唯一的 ID,但是,使用此代码,ID 会增加但永远不会减少。如何拥有一个取决于现有对象编号的唯一 ID。

2. 守则

#include <iostream>
#include <vector>
class UniqueID {
protected:
static int nextID;
public:
int id;
UniqueID();
~UniqueID();
UniqueID(const UniqueID& orig);
UniqueID& operator=(const UniqueID& orig);
};
int UniqueID::nextID = 0;
UniqueID::UniqueID() {
id = ++nextID;
}
UniqueID::~UniqueID() {
}
UniqueID::UniqueID(const UniqueID& orig) {
id = orig.id;
}
UniqueID& UniqueID::operator=(const UniqueID& orig) {
id = orig.id;
return(*this);
}
int main()
{
std::vector<UniqueID> UniqueIDs;
for (int i = 0; i < 3; i++)
{
UniqueID e;
UniqueIDs.push_back(e);
std::cout <<"Create "<< e.id << std::endl;
}
std::cout << "n";
//Delete..
for (int b = int(UniqueIDs.size()) - 1; b >= 0; b--)
{
std::cout << "Delete "<< UniqueIDs[b].id << std::endl;
UniqueIDs.erase(UniqueIDs.begin() + b);
}
std::cout << "n";
//Here the new object should get the ids for 1 to 4 
for (int i = 0; i < 3; i++)
{
UniqueID e;
UniqueIDs.push_back(e);
std::cout << "Create " << e.id << std::endl;
}
}

3. 输出

输出为:

Create 1
Create 2
Create 3
Delete 3
Delete 2
Delete 1
Create 4
Create 5
Create 6

4. 我想要什么

我希望有:

Create 1
Create 2
Create 3
Delete 3
Delete 2
Delete 1
Create 1
Create 2
Create 3

删除其中一些 ID 后,我如何记住从哪里开始?

ID通常不会像这样重复使用是有原因的,这是因为您必须保留备用 ID 的集合或已用 ID 的集合,并且无法扩展(除非您人为地将自己限制在少量"插槽"中(。

数据库只是自动递增到整数范围的顶部,然后绕回(您不太可能同时拥有 40 亿个对象!在代码中,通常只使用对象的地址,该地址已保证在其生存期内是唯一且稳定的。