• ベストアンサー

動的配列の賢い使い方

動的配列について質問です。 構造体を動的配列で今ボタンを押すたびに値を追加しています。 i = i+1 Redim preserve a(i) as ユーザ定義 ただこの方法だと追加するだけならよいのですが、 削除の時に問題があります。 例えば、配列が5つあるとします。 削除のボタンをクリックし2番目の配列を削除したとします。次に追加ボタンをクリックすると6番目に追加します。 これですと、2番目の値がないのに(5つしかないのに)6つ分のメモリを確保することになると思います。 上手はメモリ確保方法はないでしょうか? 構造体のデータは、 ・index ・文字列 ・数値 をそれぞれ持っており、indexは一応追加するごとに増えていくようになっています。 うまく説明できませんが、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

定番的なのは連想配列を使うことで、VBの場合ですとCollectionオブジェクトの使用でしょうか。 構造体のデータを、「Redim+代入」で配列に格納するかわりにCollectionへの追加(Add)にします。そのとき、キーとしてindexと一対一に対応する文字列(strで単に文字列化するのが簡単)を指定しておきます。 これなら、2個追加すれば2個分の情報だけがCollectionの中に蓄積されることになるので、そのindexが1と10000だったとしても中間の2,3,4,...,9999番目の領域まで確保されることはありません。 難点は、配列と比較してデータにアクセスする速度が劣るのと、VBの場合はいちいちキーを文字列化して与えないといけないのが面倒&さらに速度が遅くなる原因になるというところです。

NetMani-_-i
質問者

お礼

早速のご回答ありがとうございます。 Collectionオブジェクトというのがあるのですね。 一つ質問させてください。 Collectionとは配列と同じようなものと考えてよいのでしょうか? 配列と同じように使えるのでしょうか? サンプルサイト等ご存知でしたら教えていただければ幸いです。 ご回答ありがとうございました。

その他の回答 (1)

  • goma_2000
  • ベストアンサー率48% (62/129)
回答No.2

横から失礼します。 Collectionオブジェクトはデータ形式としては配列というよりはListとしての使い方になりますね。 No.1さんがいわれているように、「配列と比較してデータにアクセスする速度が劣る」というデメリットがありますが、それほど配列サイズが大きくないようでしたら問題ないはずです。 多少、実装する気であれば、Index用の配列と実際の内容がある配列の2種類用意すれば回避できます。 Index用の配列では、上記と同じ問題が起きる可能性がありますが、配列サイズはIndexと共に大きくするのではなく、ある大きさに決めておき、配列サイズより大きな値の場合は余りを用いてIndex番号をあらわせばよいです。その際に、Index番号が重複する可能性がありますが、その場合はある定数をベースにしてIndex番号をずらす処理をすれば回避できます。 これはいわゆるHashテーブルってやつですね。Hashテーブルが80%以上埋まった時には再ハッシュといって、ハッシュテーブルを作り直します。 メモリ確保を気にされているようですが、スピードとメモリはトレードオフの関係にあると思ってください。配列方のデータ形式でメモリ的に辛くないのであればそれが一番早いです(O(1)のアクセス時間なので)。そうでなく、メモリ的にかなり辛いのであればList形式(Collectionオブジェクト)となります。中間的?に、メモリを抑えつつ、アクセスを高速にするためには上記のようなHashテーブルを用いるのが良いと思います。

関連するQ&A