算法 - 检查号码是否已在列表中

Algorithm - Checking if number is already on list

我正在尝试创建一种超市软件,但遇到了一个问题。

当我添加一个客户端时,我会立即说它的 ID 是列表中的下一个,但是如果列表被手动更改,它将创建重复的 ID,所以我试图找到一种方法让 ID 成为下一个可用的 ID。但是,如果 ID 列表是这样的:

6

5

1

2

它将归因于不可用的ID 6...

如果完整的 运行 向量找不到相同的数字,我如何才能更改它的 ID?

ID = clientsV.size() + 1;
for (unsigned int g = 0; i < clientsV.size(); g++)
    {
        if (ID == clientsV.at(g).getClientID)
        ID++;
    };

首先,ID用size确实不能容错

一个简洁的概念是使用随机 ID,如果您的随机字段足够大,则发生冲突的可能性非常小。

例如,可以使用时间戳的 MD5 or uuid 作为 ID。除了比重新搜索(希望非常大的)客户列表更有效之外,它在扩展时也有一个巨大的优势:您没有一个权威机构可以发布所有组件都依赖的新 ID,以便您可以分发在许多孤立的服务器上创建新客户端。

这可能会解决您还没有遇到的问题,但这是一个很好的面向未来的方法

处理此问题的常用方法是让变量跟踪下一个未使用的 ID。例如:

class Client
{
  public:
    Client() : id_(++s_id_) { }

  private:
    int id_;
    static int s_id_;
};

int Client::s_id_ = 0;   // in client.cpp

使用 int - 假设它是 32 位 - 没有任何检查(如上所述)意味着你在大约 20 亿客户之后开始获得负 ID,并且在大约 40 亿之后可能重复,但我认为这不是问题....