【问题标题】:Algorithm - Checking if number is already on list算法 - 检查号码是否已经在列表中
【发布时间】:2016-05-16 02:03:49
【问题描述】:

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

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

【问题讨论】:

  • “你对管道的考虑越多,它就会堵塞排水管”——斯科蒂,星际迷航 III。为什么不简单地在clientsV 中找到最高ID,然后将其加1,而不是所有这些歌舞套路。如果clientsV 为空,则您的 id 为 0 或 1(任您选择)。否则,扫描一次数组,找到最高的ID,然后加1。
  • @SamVarshavchik 谢谢,但我该怎么做呢?如何找到最大的 ID?
  • 将暂定的最大 id 设置为数组中的第一个值。遍历数组的内容。对于数组中的每个值:如果该值大于暂定最大 id 值,则用该值更新暂定最大 id 值。遍历整个数组后,您现在拥有数组中的最大值。

标签: c++ arrays algorithm list verification


【解决方案1】:

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

一个简洁的概念是使用随机 ID,如果您的随机字段足够大,那么发生冲突的机会就会非常小。

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

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

【讨论】:

    【解决方案2】:

    处理此问题的常用方法是使用变量跟踪下一个未使用的 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 亿个之后可能会出现重复,但我认为这不是问题...... .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多