• 締切済み

配列のサイズを動的に拡張

お世話になっております。 配列のサイズを動的に拡張について悩んでおります。例えばint x[5]という配列があって、データが埋まったら動的にx[6]にする・・ っといったものです。自分で試行錯誤した結果、以下のようなプログラムを作成しました。 int *data,count=0,num=10;// グローバル変数 // 配列にデータを加える関数add void add(int t){  if(count+1>num){ // サイズを超えたら配列をサイズを+1    int i,*tmp_data;    tmp_data = new int [count];    for(i=0;i<num;i++) tmp_data[i] = data[i]; // 一時的に保存    delete[] data; // 古いのを消す    data = new int [num+1]; // 新しく作る    for(i=0;i<num;i++) data[i] = tmp_data[i]; // 新しいのにコピー    num+=1; // 最大値をプラス    data[count]=t;    delete[] tmp_data;  }  else data[count]=t;  count++; // 入力されたカウントをプラス } main関数内で、data = new int [10];と宣言し、add(3);のように使用しています。またnewのメモリ確保のエラー処理は省いております。 動くことは動くのですが・・ご覧の通り、グローバル変数が3つになり、データをコピーしたりと、複雑になってしまいました。 もっと簡単に出来るのでは・・っと思い質問させて頂きました。 こうすれば、もっと簡単になるよ!など。。ご回答頂ければ幸いです。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

質問の内容とは異なりますが一点。 1個オーバしたからといって、1個多くするのは あまり効率がいいやり方ではありません。 次にまた入ってきたらまた1個増やさなくてはなりませんし。。。 このような場合、オーバしたらある程度の大きさを追加する方が 良いでしょう。

noname#138858
質問者

お礼

ご回答ありがとうございました。 確かにそうですね、参考にさせていただきます(^-^)

回答No.2

reallocを使えば?

noname#138858
質問者

お礼

回答、ありがとう。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

new を使っているということは C++ ? 自作するのであれば、適当に 配列のインターフェースとなるクラスと、メモリ管理用の内部クラスを作って、handle-body イディオムでごちゃごちゃやる。 std::vector でいいじゃん。

noname#138858
質問者

お礼

C++です。ご回答ありがとうございました。

関連するQ&A