提问者:小点点

如何为增加或减少对象分配唯一标识符


我想有一个唯一的ID为每个对象,但与此代码增加但不减少,我如何才能有一个唯一的ID依赖于存在的对象的数字。

#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;
    }
}

输出为:

Create 1
Create 2
Create 3

Delete 3
Delete 2
Delete 1

Create 4
Create 5
Create 6

我希望:

Create 1
Create 2
Create 3

Delete 3
Delete 2
Delete 1

Create 1
Create 2
Create 3

共1个答案

匿名用户

ID通常不会这样重复使用是有原因的,这是因为您必须保留一个备用ID的集合,或者保留一个使用过的ID的集合,而且这不会扩展(除非您人为地将自己限制在少量的“插槽”中)。

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