掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26899

自作の可変長配列(vector)の設計方法
投稿者---def(2006/05/19 02:09:08)


C++の話も良いんでしょうか、と今頃気づいたのですが...いいですか?

STLのVectorは配列の後ろにデータを突っ込んでどんどん長さを増やせるみたいですが、自前で作るにはどうすればいいのでしょうか?
int a[x] (xは定数)としてしまうと、それ以上aの配列は増やせませんよね?

-----
あくまで学習目的での質問ですので、「素直にvector使え」という解答はご遠慮ください。
私も、「確かにそうだ」としかコメントできないので...m(__)m


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:自作の可変長配列(vector)の設計方法 26900 επιστημη 2006/05/19 06:30:24


No.26900

Re:自作の可変長配列(vector)の設計方法
投稿者---επιστημη(2006/05/19 06:30:24)


>STLのVectorは配列の後ろにデータを突っ込んでどんどん長さを増やせるみたいですが、自前で作るにはどうすればいいのでしょうか?
>int a[x] (xは定数)としてしまうと、それ以上aの配列は増やせませんよね?

int* x = 0;
size_t capacity = 0; /* 容量 */
size_t size = 0; /* 要素数 */

としておいて、要素追加の際に:
if ( capacity == size ) {
 int* tmp = new int[capacity+N]; /* N:増加分 */
 copy(x, x+capacity, tmp);
 delete[] x;
 x = tmp;
 capacity += N;
}
x[size++] = 追加要素;



この投稿にコメントする

削除パスワード

No.26903

Re:自作の可変長配列(vector)の設計方法
投稿者---def(2006/05/19 22:31:30)


すいません、コードが何をしているかよく分かりません。
capacityとsizeですが、何のためにあるのでしょうか?
要素数(可変長配列の最後)だけでいい気がしますが...

要素を一個増やす場合、
int* tmp = new int[size+1];
tmp[size+1] = 新要素;
for(int i=0;i<size;i++)
{
    temp[i]=current[i];
}
delete [] current //古い方の配列を消去
int* current = new int[size+1]; //新しい配列を作成
for(int i=0;i<size+1;i++)
{
    current[i]=temp[i];
}
delete [] temp;


問題は、これで動くかどうか...


この投稿にコメントする

削除パスワード

No.26904

Re:自作の可変長配列(vector)の設計方法
投稿者---def(2006/05/19 22:33:20)


あ、size++が最後に抜けてましたorz


この投稿にコメントする

削除パスワード

No.26906

Re:自作の可変長配列(vector)の設計方法
投稿者---επιστημη(2006/05/19 22:52:35)


>capacityとsizeですが、何のためにあるのでしょうか?
>要素数(可変長配列の最後)だけでいい気がしますが...

メモリの確保/解放はコスト高つまり思いのほか時間を消費します。
だから要素追加のたんびにnew/deleteを繰り返すのが'もったいない'
と感じるなら、いくつか余分に確保しておき、足りなくなったらまとめて。



この投稿にコメントする

削除パスワード

No.26910

Re:自作の可変長配列(vector)の設計方法
投稿者---Blue(2006/05/20 00:00:38)


なんか無駄が多いですね。
ポインタなんだから、2度newする必要はないでしょう。
int* temp = new int[ size + 1 ];
memcpy( temp, current, size );  // いままでの配列のコピー
delete[] current;   // 古いほうの配列を削除
current = temp;

current [ size ] = 新要素; // temp[ size + 1 ] ではないですよ。

それと、C++の質問はあまりしないほうがよさそうです。
(過去にそのような話題があったような気がした。)



この投稿にコメントする

削除パスワード

No.26911

Re:自作の可変長配列(vector)の設計方法
投稿者---def(2006/05/20 00:15:01)


私は思考能力が足りないようですorz

いろいろアルゴリズムについては学習していきます。
解答ありがとう御座いましたm(__)m

>>επιστημηさん
たしかに、非常に頻繁にデータを入れ替えるなら10位の単位で拡張した方が良いですね。
ありがとう御座いましたm(__)m

>>Blueさん
C++の話題は控えた方が良いですか...
基本的にC++から始めてるので何処までがCなのか今ひとつ分からないので、今後も無意識のうちにC++の話題が飛び込むかも知れませんが今後もよろしくお願いしますm(__)m
って、C++から始めたからポインタが怪しいんですけど...


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧