プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。
配列のサイズを動的に拡張について悩んでおります。例えば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つになり、データをコピーしたりと、複雑になってしまいました。
もっと簡単に出来るのでは・・っと思い質問させて頂きました。
こうすれば、もっと簡単になるよ!など。。ご回答頂ければ幸いです。

A 回答 (3件)

質問の内容とは異なりますが一点。


1個オーバしたからといって、1個多くするのは
あまり効率がいいやり方ではありません。
次にまた入ってきたらまた1個増やさなくてはなりませんし。。。
このような場合、オーバしたらある程度の大きさを追加する方が
良いでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/21 12:26

reallocを使えば?

    • good
    • 0
この回答へのお礼

回答、ありがとう。

お礼日時:2007/06/21 12:25

new を使っているということは C++ ?



自作するのであれば、適当に 配列のインターフェースとなるクラスと、メモリ管理用の内部クラスを作って、handle-body イディオムでごちゃごちゃやる。

std::vector でいいじゃん。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/21 12:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!