2016-05-16 17 views
0

私はある種のスーパーマーケットソフトウェアを作成しようとしていますが、問題が発生しました。アルゴリズム - 番号がすでにリストにあるかどうかを調べる

クライアントを追加するとすぐにIDがリストの次のIDとなりますが、リストを手動で変更するとIDが重複して作成されるため、IDを次の使用可能にする方法を見つけようとしていますID。 IDのリストは、このようなものですただし:

それは...

を使用できないID 6属性ますベクトルの完全な実行で等しい数が見つからない場合、どのようにIDを変更するだけですか?

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

"配管を徹底的に考えすぎると、排水を止めることになります。" - Scotty、Star Trek III。単純に 'clientsV'の中で最も高いIDを見つけて、それに1を加えて、なぜこの曲やダンスのルーチンのすべてにするのではないのですか? 'clientsV'が空の場合、あなたのIDは0または1です(あなたの選択を取る)。それ以外の場合は、アレイを1回スキャンし、最も高いIDを見つけて1を追加します。 –

+0

@SamVarshavchikありがとうございます。どうすればいいですか?最大のIDを見つけるにはどうすればいいですか? –

+0

仮最大IDを配列の最初の値に設定します。配列の内容を繰り返し処理します。配列の各値について:値が仮の最大のid値より大きい場合は、この値で仮の最大のid値を更新します。配列全体を反復処理した後、配列内で最大の値を持つようになりました。 –

答えて

0

最初に、IDのサイズを使用すると、実際にフォールトトレラントではありません。

あなたのランダムなフィールドが十分に大きい場合、衝突の可能性が非常に小さい場合、きちんとした概念はランダムIDを使用することです。

たとえば、タイムスタンプのMD5またはuuidをIDとして使用できます。クライアントのリスト(うまくいけば非常に大きい)を再検索するよりもはるかに効率的ですが、スケーリングの際にも大きな利点があります。つまり、すべてのコンポーネントが依存する新しいIDを発行する権限は1つもありません多くの隔離されたサーバーに新しいクライアントを作成します。

これは、あなたがまだ持っていないが、それはこれを処理する一般的な方法は、次の未使用IDの変数キープトラックを持っている

0

素敵な将来性アプローチだ問題に対処することができます。たとえば、次のように - それは32ビットだと仮定すると - 任意のチェックをせずに(上記のように)あなたは〜40億後〜20億クライアント後の負のID、および潜在的な重複を取得を開始意味が、私はそれがないと仮定しintを使用して

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

    private: 
    int id_; 
    static int s_id_; 
}; 

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

問題... ....

関連する問題