次のような要件で、各要素に自動的に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を新規追加要素に割り当てる方法しかないのでしょうか?
このような事をもっとシンプルに実現したクラス等はないのでしょうか?
データベース等の外部ソフトウェアは使用しないものとします。
No.2ベストアンサー
- 回答日時:
>これが最もスマートなやり方でしょうか?
さあ?
私が今思いつくなかでスマートな方法を紹介したつもりなので
それよりスマートな方法がないか問われましても・・・
ただ「その削除済みリストを参照して最も若いIDを使用すれば」は、
質問内容からすると最も若いIDの必要はないんじゃないかとは思いますが。
条件によりますが
オブジェクトのポインタ値を、そのままIDとして使用する手もありますが。
ご回答ありがとうございます。
オブジェクトのポインタ値をそのままIDにすれば、確かにユニーク値になるとは思いますが、ランダムな値ではそれに依存したコードが書けません。
確かに最小のIDを使用する必要はありませんね。リストの先頭から再利用すれば良いと思います。
やり方については他の方にも意見を求めたかったので。
No.3
- 回答日時:
何をもって「効率的」とするのでしょうか?
一般的には、おそらくC++ということで、普通にSTLで実装すれば良いんじゃないでしょうか。
もしこのリストが、極端に規模が大きい物であれば、
C言語で記述して多分探索木で実装するのが高速です。
No.1
- 回答日時:
削除されたIDも管理してあげればよいのでは?
この回答への補足
質問に間違った記述がありました。
>このように常に「IDの最大値=配列のサイズ」となるようにしておきたいのです。
これは必ずしもこのようにはなりません。この一文は無視してください。
早速のご回答ありがとうございます。
なるほど、そういうことですよね。
削除済みIDリストを別の配列として持っておいて、要素削除の時点でIDをそのリストに追加し、次に要素を追加する時点で、その削除済みリストを参照して最も若いIDを使用すれば良いということですね。
削除済みがなければ、(本配列のサイズ+1)を新たなIDとして採番し、追加する。
これが最もスマートなやり方でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- 英語 「第1および第2の要素」の英語 4 2022/03/24 09:55
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Chrome(クローム) 入力フォームの履歴を消したい 2 2023/06/29 13:02
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- 数学 線形代数学の問題です! Vは 4 次元ベクトル空間とし線形変換 f ∶ V→ V のある基底 v1, 1 2022/06/12 09:25
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラマーです。このDB設計...
-
0 == False はいいけど
-
プログラム言語について c言語...
-
プログラミングでArduinoのc++...
-
Python、プログラミングについ...
-
swift言語の最適化 swift最適化...
-
C言語関数違いについて。
-
右ビットシフト
-
応用情報技術者試験の令和元年...
-
なんで
-
だれがとけるの?
-
C#,vb.netで業務用アプリ開発と...
-
へんな現象
-
プログラミングについて。 1つ...
-
システムエンジニアの適正について
-
c言語
-
C++でデスクトップGUIアプリ開...
-
VisualStudioでのプログラミン...
-
C言語って古いですか?
-
C言語です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET の配列の要素数
-
変な質問ですみません、n番目の...
-
配列の要素番号を取得するには?
-
重複しない乱数の生成
-
VBでボタンを押すと画像をラン...
-
DataGridでCTRLキーを押さずに...
-
重複しない乱数整数を発生させる。
-
景品パネルの作り方
-
VB6 複数行のテキストをリスト...
-
ランダム表示を重複させないよ...
-
ランダムに6つの数字を選びその...
-
Flashでランダムクイズゲームを...
-
【数字ランダム】計算問題ラン...
-
複数の変数宣言を、for文で一気...
-
[Objective-c]多次元配列のアク...
-
Vba 配列の中の特定文字列の位...
-
二次元配列
-
データ構造のテキスト保存につ...
-
簡単な当たり判定作りたい
-
絵を描き、その都度のxy座標を...
おすすめ情報