算法 - 检查数字是否已列在列表中

时间:2016-05-16 02:03:50

标签: c++ arrays algorithm list verification

我试图创建一种超市软件,我想出了一个问题。

当我添加客户端时,我立即说它的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++;
    };

2 个答案:

答案 0 :(得分:0)

首先,使用ID的大小确实不是容错的。

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

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

这可能正在解决您尚未拥有的问题,但这是一个很好的未来证明方法

答案 1 :(得分:0)

处理此问题的常用方法是让变量跟踪下一个未使用的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亿客户之后开始得到负ids,并且在约40亿之后可能重复,但我认为& #39;不是问题......