※ ChatGPTを利用し、要約された質問です(原文:IDの自動採番について)
最も効率的なIDの自動採番方法について
このQ&Aのポイント
各要素に自動的にIDを採番する方法について調査しています。要素は連想配列に格納され、一つずつ配列に追加されます。削除した要素のIDを次に追加する要素で再利用したいです。
IDの最大値を最小化したいため、要素を削除した際にID値を前に詰めることはできません。連想配列を使用して実装し、要素の追加時に空きIDを探して割り当てる方法を検討しています。
シンプルにIDの自動採番を実現するためのクラスや方法を探しています。外部ソフトウェアは使用せずに実現したいです。
次のような要件で、各要素に自動的にIDを採番したいのですが、最も効率的なやり方はどのような方法でしょうか?
・各要素は連想配列に格納される(MFCならCMap等)
・要素は一つずつ配列に追加される。追加する際、IDを自動採番して、これをキーとする。
・任意の要素を、キー(自動採番されたID)指定で削除することが出来る。
・IDの最大値は最小化したい。
最後の要件は、IDの値そのものにある意味を持たせているため、可能な限りIDの値を大きくしたくありません。つまり、ある要素を削除した場合、IDも同時に削除されますが、そのID値を次に追加する要素で再利用したいと言うことです。
IDは所謂主キーですので、要素を削除した際にID値を前に詰めるような事はもちろん出来ません。一旦ある要素にIDを割り当てると、その要素が削除されるまで値を変更することは出来ません。
格納される要素をElementとすると
ID - Element
------------
1 - Element[1]
2 - Element[2]
3 - Element[3]
4 - Element[4]
5 - Element[5]
このような配列になっていた場合、ID"3"の要素を削除すると配列は下記のようになります。
ID - Element
------------
1 - Element[1]
2 - Element[2]
4 - Element[4]
5 - Element[5]
次に6番目の要素を挿入する際、その要素にID"3"を割り当てます。
key - Element
------------
1 - Element[1]
2 - Element[2]
4 - Element[4]
5 - Element[5]
3 - Element[6]
このように常に「IDの最大値=配列のサイズ」となるようにしておきたいのです。
配列内の並びは使用する配列クラスの実装に依りますので、必ずしも上記のようになっているわけではありません。
要素がオブジェクト型で、かつIDとして割り当てる数値も単なる数値以上の意味を持たせるため、連想配列はCMapPtrToPtrクラス(またはそれに相当するクラス)で実装したいと思っています。
この場合、要素追加の度に、一旦全てのキー(ID)を配列から取り出して、ソートしてから空きIDを探し、そのIDを新規追加要素に割り当てる方法しかないのでしょうか?
このような事をもっとシンプルに実現したクラス等はないのでしょうか?
データベース等の外部ソフトウェアは使用しないものとします。
お礼
ご回答ありがとうございます。 オブジェクトのポインタ値をそのままIDにすれば、確かにユニーク値になるとは思いますが、ランダムな値ではそれに依存したコードが書けません。 確かに最小のIDを使用する必要はありませんね。リストの先頭から再利用すれば良いと思います。 やり方については他の方にも意見を求めたかったので。