- 締切済み
配列のサイズを動的に拡張
お世話になっております。 配列のサイズを動的に拡張について悩んでおります。例えば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つになり、データをコピーしたりと、複雑になってしまいました。 もっと簡単に出来るのでは・・っと思い質問させて頂きました。 こうすれば、もっと簡単になるよ!など。。ご回答頂ければ幸いです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- aris-wiz
- ベストアンサー率38% (96/252)
質問の内容とは異なりますが一点。 1個オーバしたからといって、1個多くするのは あまり効率がいいやり方ではありません。 次にまた入ってきたらまた1個増やさなくてはなりませんし。。。 このような場合、オーバしたらある程度の大きさを追加する方が 良いでしょう。
- gyrocompas
- ベストアンサー率23% (24/104)
reallocを使えば?
お礼
回答、ありがとう。
- koko_u_
- ベストアンサー率18% (459/2509)
new を使っているということは C++ ? 自作するのであれば、適当に 配列のインターフェースとなるクラスと、メモリ管理用の内部クラスを作って、handle-body イディオムでごちゃごちゃやる。 std::vector でいいじゃん。
お礼
C++です。ご回答ありがとうございました。
お礼
ご回答ありがとうございました。 確かにそうですね、参考にさせていただきます(^-^)