少なくとも未使用の ID のコレクションを維持する必要があります。さらに、ルックアップ テーブルを投入して、ID が渡されたことを確認します (堅牢性のため)。どちらの場合も、リストではなく を使用することをお勧めしますstd::vector
。
まず、未使用のコレクションを に保存しstd::vector<int>
ます。これは非常に簡単に初期化できます。
class IdStore {
private:
std::vector<int> unused;
static int const MIN_ID = -101;
static int const MAX_ID = -2;
public:
IdStore::IdStore()
: unused(MAX_ID - MIN_ID + 1) {
for (auto i = 0; i <= MAX_ID-MIN_ID; ++i) {
unused[i] = i;
}
}
int getId();
void releaseId(int);
};
さらに、使用された ID を追跡して、ID が配布されたかどうかを確認することもできます。そのためのメンバーを使用します。これは、その値がすべてデフォルトで最初に設定されるため、std::vector<bool> used;
簡単に初期化できます。もちろん、a を作成することもできますが、コンパイル時に to の距離を知る必要があることに注意してください。used(MAX_ID - MIN_ID +1)
false
used
bitset
MIN_ID
MAX_ID
そこから物を配るのはとても簡単です:
int IdStore::getId() {
if (unused.empty())
throw "error"; // put something better here
auto r = unused.back();
used[r] = true;
unused.pop_back();
return MIN_ID + r;
}
また、それらを解放します。
void IdStore::releaseId(int id) {
if (id < MIN_ID || id > MAX_ID)
throw "error"; // put something better here
id -= MIN_ID;
if (!used[id])
throw "error"; // put something better here
used[id] = false;
unused.push_back(id);
}
再割り当ては行われないことに注意してください。ベクトルはそのサイズを維持し、リストを使用したアプローチへの高価な呼び出しや反対の呼び出しを必要としませgetId
ん。releaseId
malloc
free